On Mon, Dec 1, 2008 at 12:23 PM, Rayene Ben Rayana <[EMAIL PROTECTED]> wrote: > Thanks Chris, > > Yeah it is kinda meta thing. My app allows to create a scene (a set of GUI > objects). A scene can be saved as a python script. And, it can be loaded > again using execfile(). > > each GUI object has a label. So, in the script scene, declaring an object in > a scene file should look like this: > > red_car = MyVehicleClass(label = 'red_car') > > But, I wanted to simplify the syntax of scene files and avoid repetition so > it would look like > > red_car = MyVehicleClass() > > with the label attribute automatically set to the name of the corresponding > variable. > I tried your locals().iteritems tip and it works perfectly. > > The question now is: Given what I just explained, do you still think it is > bad programming to do that ? Should I better use the first syntax ?
Assuming the object declarations are all at the module-level and you have some rule for dealing with objects with multiple "names", using the trick I outlined but with globals() instead of locals() seems reasonable, albeit a bit of a hack, but since this is just a script, that seems acceptable. IMHO, it's an OK trade-off in order to comply with the DRY (Don't Repeat Yourself) principle in this case. Cheers, Chris -- Follow the path of the Iguana... http://rebertia.com > > Cheers, > > Rayene, > > I want to use that to simplify the syntax of the > > On Mon, Dec 1, 2008 at 7:37 PM, Chris Rebert <[EMAIL PROTECTED]> wrote: >> >> On Mon, Dec 1, 2008 at 6:04 AM, Rayene Ben Rayana >> <[EMAIL PROTECTED]> wrote: >> > Hello everybody, >> > >> > Is there an easy way to do something like this in python ? >> > >> >>>> red_car = MyVehicleClass() >> >>>> car = red_car >> >>>> car.labels() >> > ['red_car' , 'car' ] >> > >> > In other words, does an instance has access to its name pointers ? >> >> In short, No. (Cue another debate over whether Python uses call-by-X >> semantics...) >> >> Typically people who want to do such things actually want/should use a >> dictionary mapping string keys to instance values instead. >> >> Note that in certain limited cases, voodoo involving the locals() or >> globals() built-in functions or the `inspect` module can work, but not >> in the common general case. But generally these techniques are >> considered bad style and kludgey unless you're writing a debugger or >> something equally meta, with using a dictionary as explained >> previously being much preferred. >> >> For example, for your particular code above, the following happens to >> work: >> [name for name, obj in locals().iteritems() if obj is car] #==> >> ['red_car' , 'car' ] >> >> But this will only give the names in the current function of the >> particular car object. Likewise, globals() works only for module-level >> names, and the `inspect` module's magic only works for names in >> calling functions (i.e. those below the current one in the callstack). >> >> Cheers, >> Chris >> -- >> Follow the path of the Iguana... >> http://rebertia.com >> >> > >> > Thanks in advance, >> > >> > Rayene >> > >> > >> > -- >> > http://mail.python.org/mailman/listinfo/python-list >> > >> > -- http://mail.python.org/mailman/listinfo/python-list