On Tue, 10 Nov 2009 06:59:25 -0800, NickC <reply...@works.fine.invalid> wrote:

I can't seem to find a way to do something that seems straighforward, so I
must have a mental block.  I want to reference an object indirectly
through a variable's value.

Using a library that returns all sorts of information about "something", I
want to provide the name of the "something" via a variable (command line
argument).  The something is a class in the library and I want to
instantiate an object of the class so I can start querying it.  I can't
figure out how to pass the name of the class to the library.

Or, put another way, I can't figure out how to indirectly reference the
value of the command line argument to create the object.

To make it clearer, it's roughly equivalent to this in bash:
 Sun="1AU" ; body=Sun; echo ${!body} --> outputs "1AU".

command line:
$ ./ephemeris.py Moon

code:
import ephem
import optparse

# various option parsing (left out for brevity),
# so variable options.body contains string "Moon",
# or even "Moon()" if that would make it easier.

# Want to instantiate an object of class Moon.
# Direct way:
moon1 = ephem.Moon()
# Indirect way from command line with a quasi bashism that obviously fails:
moon2 = ephem.${!options.body}()

Can someone point me in the right direction here?

(The library is PyEphem, an extraordinarily useful library for anyone
interested in astronomy.)

Many thanks,


Since Python 'variables' are really keys in a namespace dictionary, it's fairly straightforward to get at them given a string value -- what you probably want in this case is the built-in function getattr() (http://www.diveintopython.org/power_of_introspection/getattr.html)...

So getattr(ephem, "Moon") should give you the class object ephem.Moon, which you can then instantiate...



--
Rami Chowdhury
"Never attribute to malice that which can be attributed to stupidity" -- Hanlon's Razor
408-597-7068 (US) / 07875-841-046 (UK) / 0189-245544 (BD)
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to