Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Create object from variable indirect reference?

Reply
Thread Tools

Create object from variable indirect reference?

 
 
NickC
Guest
Posts: n/a
 
      11-10-2009


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,

--
NickC
 
Reply With Quote
 
 
 
 
Jon Clements
Guest
Posts: n/a
 
      11-10-2009
On Nov 10, 2:59*pm, NickC <(E-Mail Removed)> 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,
>
> --
> NickC


A direct way is to use:

moon1 = getattr(ephem, 'Moon')()

hth
Jon.
 
Reply With Quote
 
 
 
 
Rami Chowdhury
Guest
Posts: n/a
 
      11-10-2009
On Tue, 10 Nov 2009 06:59:25 -0800, NickC <(E-Mail Removed)>
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_.../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)
 
Reply With Quote
 
Hrvoje Niksic
Guest
Posts: n/a
 
      11-10-2009
NickC <(E-Mail Removed)> writes:

> moon2 = ephem.${!options.body}()


moon2 = getattr(ephem, options.body)()
 
Reply With Quote
 
NickC
Guest
Posts: n/a
 
      11-10-2009

Many thanks for the replies. getattr() works great:

>>> name='Moon'
>>> m2 = getattr(ephem,name)()
>>> m2.compute(home)
>>> print ephem.localtime(m2.rise_time)

2009-11-11 01:30:36.000002

shows the moon will rise at 1:30am localtime tonight at my home location.

Excellent.

--
NickC
 
Reply With Quote
 
jhermann
Guest
Posts: n/a
 
      11-17-2009
On 10 Nov., 17:03, NickC <(E-Mail Removed)> wrote:
> Many thanks for the replies. *getattr() works great:


You can get a little more versatile and even specify the location of
the name (i.e. the module / package name) without pre-importing it,
like this...

def importName(modulename, name=None):
""" Import identifier C{name} from module C{modulename}.

If name is omitted, modulename must contain the name after the
module path, delimited by a colon.

@param modulename: Fully qualified module name, e.g. C{x.y.z}.
@param name: Name to import from C{modulename}.
@return: Requested object.
@rtype: object
"""
if name is None:
modulename, name = modulename.split(':', 1)
module = __import__(modulename, globals(), {}, [name])
return getattr(module, name)

print importName("socket:gethostname")()


This is especially useful if you want to specify factory classes or
the like in a non-python config file. The syntax is the same as that
of setuptools entry points.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
XSLT indirect variable lookup Zachary Turner XML 4 06-01-2007 01:04 PM
Object creation - Do we really need to create a parent for a derieved object - can't the base object just point to an already created base object jon wayne C++ 9 09-22-2005 02:06 AM
indirect object notation confusion slowpoison Perl Misc 2 06-23-2005 10:43 PM
"indirect" ipsec dt1649651@yahoo.com Cisco 3 05-19-2005 08:17 PM
Indirect use of COM George Ter-Saakov ASP .Net 2 08-27-2003 03:03 PM



Advertisments