python gripes survey
Sean Ross
sross at connectmail.carleton.ca
Wed Aug 27 15:30:23 EDT 2003
"Gonçalo Rodrigues" <op73418 at mail.telepac.pt> wrote in message
news:15dpkvsfatkrlode3rc9h1trihsb3ppcj3 at 4ax.com...
[snip]
> Related with this is the global declaration -- the only
> declaration in Python! There should be another way to handle this:
> something like scopes becoming objects where the names bound in it are
> it's attributes and then you would have two functions global() and
> enclosing() returning the global and the enclosing scope. Or something
> to this effect :-)
>
This is probably not what you want, and it's probably worse than just using
a global declaration, but it *is* "another way to handle this":
>>> # put this at the top of your module,
>>> # to grab hold of this module's namespace
>>> import __main__ as main
>>> g = "global variable"
>>> def f():
... main.g = "re-bound global"
...
>>> f()
>>> g
're-bound global'
>>>
If you want a global() function that returns the namespace, you can do this:
#
# your_utils.py
#
# I'll use the name 'main' rather than shadow the global keyword
def main():
import __main__
return __main__
# other_module.py
from your_utils import main
foo = "foo"
def bar():
print main().foo
# output
foo
I have no idea what issues this raises, but that is not my concern here -
I'm just seeing whether there is "another way to handle this". It looks like
there is. Usual disclaimers apply: "Don't do that", "Use at your own risk",
"Yada, Yada"
I can't help you with "names bound in nested scopes are read-only, not
rebindable". I tried to implement your enclosing() idea. I made a
'namespace' class to use as follows:
def foo():
x = 1
def bar():
# context is the number of frames to go back
outer = namespace(context=1)
# outer keeps a reference to foo's frame
outer.x = 2
# so, I tried to re-bind the x in foo using something like
# self.frame.f_locals['x'] = 2, but f_locals is not writable!
# I made several attempts to circumvent this, but no success.
bar()
print x
foo()
# output
1
Oh well...
"just seeing if it can be done-ly yours"
Sean
More information about the Python-list
mailing list