Luis M. González a écrit :
On Feb 24, 8:48 am, Bruno Desthuilliers <bruno.
42.desthuilli...@websiteburo.invalid> wrote:
Luis M. Gonz lez a crit :


And what about the trick of updating globals? Is it legal?
It's legal, but it's (usually) a very bad idea - at the top-level, it
harms readability, and from within a function it's doubly bad
(readibility + "globals are evil").

Now as usual with GoldenRules(tm), it's meant to be broken - once you do
know why you shouldn't _usually_ do it.

If not, is
there any "legal" way to do what the OP needs?

I still don't understand why is it a bad idea in the case of
globals().

please not the _usually_.

This is the only way I know to define variables programatically  in the
top-level namespace,  without having to do it manually one by one.

I don't see the readability problem either.

# wrong.py

x = 42

def bar():
   return x + 1


def test():
   y = bar()
   assert y==43

# snip 1kloc

def foo():
   globals()[x] = 43
   quux()

# snip some more core

def quux():
   globals()[y] = 1138

# snip some more core

if __name__ == '__main__':
   foo()


Enjoy...

Talking about Goldenrules(tm), what's the recomended way to do it?

The "recommanded way" is
1/ to avoid using globals to share state whenever possible
2/ to avoid creating globals from a function

If your problem is to conditionnaly define globals (based on environment value or whatnot), then just write the conditional at the top level.

Now I don't say there's no legitimate use case for updating the global namespace from within a function - just that this is a very very very rare beast (never meet her as far as I'm concerned, and I did write some hairy code), and even then is BadEnough(tm) to require a good documentation.

FWIW, your example seemed to be about updating the global namespace from within a function just to have the names available in the function, which is about the worst possible solution to the OP problem.

wrt/ the OP question, mapping a sequence of values to a sequence of names is a legitimate concern, but you just dont need to define these names in the local namespace to use them - just stick'em in a dict and you're fine.

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to