From: Roy Smith on 1 Mar 2010 23:27 From inside a module, I want to add a key-value pair to the module's __dict__. I know I can just do: FOO = 'bar' at the module top-level, but I've got 'FOO' as a string and what I really need to do is __dict__['Foo'] = 'bar' When I do that, I get "NameError: name '__dict__' is not defined". Is it possible to do what I'm trying to do?
From: Chris Rebert on 2 Mar 2010 00:38 On Mon, Mar 1, 2010 at 8:27 PM, Roy Smith <roy(a)panix.com> wrote: > >From inside a module, I want to add a key-value pair to the module's > __dict__. Â I know I can just do: > > FOO = 'bar' > > at the module top-level, but I've got 'FOO' as a string and what I > really need to do is > > __dict__['Foo'] = 'bar' > > When I do that, I get "NameError: name '__dict__' is not defined". Â Is > it possible to do what I'm trying to do? Yes; just modify the dict returned by the globals() built-in function instead. It's usually not wise to do this and is better to use a separate dict instead, but I'll assume you know what you're doing and have good reasons to disregard the standard advice due to your use-case. Cheers, Chris -- One should avoid using the Big Hammer unnecessarily, but sometimes you really do need it and it's nice that it's available for such cases. http://blog.rebertia.com
From: Jean-Michel Pichavant on 2 Mar 2010 05:29 Roy Smith wrote: > >From inside a module, I want to add a key-value pair to the module's > __dict__. I know I can just do: > > FOO = 'bar' > > at the module top-level, but I've got 'FOO' as a string and what I > really need to do is > > __dict__['Foo'] = 'bar' > > When I do that, I get "NameError: name '__dict__' is not defined". Is > it possible to do what I'm trying to do? > test.py: import sys varName= 'foo' setattr(sys.modules[__name__], varName, 42) in a shell: import test print test.foo >>> 42 JM
From: Roy Smith on 2 Mar 2010 08:21 In article <mailman.96.1267508316.23598.python-list(a)python.org>, Chris Rebert <clp2(a)rebertia.com> wrote: > On Mon, Mar 1, 2010 at 8:27 PM, Roy Smith <roy(a)panix.com> wrote: > > >From inside a module, I want to add a key-value pair to the module's > > __dict__. I know I can just do: > > > > FOO = 'bar' > > > > at the module top-level, but I've got 'FOO' as a string and what I > > really need to do is > > > > __dict__['Foo'] = 'bar' > > > > When I do that, I get "NameError: name '__dict__' is not defined". Is > > it possible to do what I'm trying to do? > > Yes; just modify the dict returned by the globals() built-in function > instead. Ah, cool. Thanks. > It's usually not wise to do this and is better to use a > separate dict instead, but I'll assume you know what you're doing and > have good reasons to disregard the standard advice due to your > use-case. Why is it unwise? The use case is I'm importing a bunch of #define constants from a C header file. I've got triples that I want to associate; the constant name, the value, and a string describing it. The idea is I want to put in the beginning of the module: declare('XYZ_FOO', 0, "The foo property") declare('XYZ_BAR', 1, "The bar property") declare('XYZ_BAZ', 2, "reserved for future use") and so on. I'm going to have hundreds of these, so ease of use, ease of maintenance, and niceness of presentation are important. My declare() function will not just set XYZ_FOO = 1 at module global scope, but also insert entries in a variety of dicts so I can look up the description string, map from a value back to the constant name, etc. I *could* do this in a separate dict, but the notational convenience of being able to have the original constant names globally available is pretty important.
From: Steve Holden on 2 Mar 2010 08:33 Roy Smith wrote: > In article <mailman.96.1267508316.23598.python-list(a)python.org>, > Chris Rebert <clp2(a)rebertia.com> wrote: > >> On Mon, Mar 1, 2010 at 8:27 PM, Roy Smith <roy(a)panix.com> wrote: >>> >From inside a module, I want to add a key-value pair to the module's >>> __dict__. � I know I can just do: >>> >>> FOO = 'bar' >>> >>> at the module top-level, but I've got 'FOO' as a string and what I >>> really need to do is >>> >>> __dict__['Foo'] = 'bar' >>> >>> When I do that, I get "NameError: name '__dict__' is not defined". � Is >>> it possible to do what I'm trying to do? >> Yes; just modify the dict returned by the globals() built-in function >> instead. > > Ah, cool. Thanks. > >> It's usually not wise to do this and is better to use a >> separate dict instead, but I'll assume you know what you're doing and >> have good reasons to disregard the standard advice due to your >> use-case. > > Why is it unwise? > > The use case is I'm importing a bunch of #define constants from a C header > file. I've got triples that I want to associate; the constant name, the > value, and a string describing it. The idea is I want to put in the > beginning of the module: > > declare('XYZ_FOO', 0, "The foo property") > declare('XYZ_BAR', 1, "The bar property") > declare('XYZ_BAZ', 2, "reserved for future use") > > and so on. I'm going to have hundreds of these, so ease of use, ease of > maintenance, and niceness of presentation are important. > > My declare() function will not just set XYZ_FOO = 1 at module global scope, > but also insert entries in a variety of dicts so I can look up the > description string, map from a value back to the constant name, etc. > > I *could* do this in a separate dict, but the notational convenience of > being able to have the original constant names globally available is pretty > important. > And how important is it to make sure that whatever data your program processes doesn't overwrite the actual variable names you want to use to program the processing? If you use this technique you are effectively making your program a hostage to fortune, as you no longer control the namespace you are using for the programming. regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 PyCon is coming! Atlanta, Feb 2010 http://us.pycon.org/ Holden Web LLC http://www.holdenweb.com/ UPCOMING EVENTS: http://holdenweb.eventbrite.com/
|
Next
|
Last
Pages: 1 2 3 Prev: Call for Participation: CHR Summer School Next: How to find an COM object in using of pywin32 |