Getting module path string from a class instance

2012-11-12 Thread Some Developer

I'm trying to find a way to get a string of the module path of a class.

So for instance say I have class Foo and it is in a module called 
my.module. I want to be able to get a string that is equal to this: 
"my.module.Foo". I'm aware of the __repr__ method but it does not do 
what I want it to do in this case.


Can anyone offer any advice at all?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Getting module path string from a class instance

2012-11-12 Thread Some Developer

On 13/11/2012 07:19, Steven D'Aprano wrote:

On Tue, 13 Nov 2012 06:38:31 +0000, Some Developer wrote:


I'm trying to find a way to get a string of the module path of a class.

So for instance say I have class Foo and it is in a module called
my.module. I want to be able to get a string that is equal to this:
"my.module.Foo". I'm aware of the __repr__ method but it does not do
what I want it to do in this case.

Can anyone offer any advice at all?

py> from multiprocessing.pool import Pool
py> repr(Pool)
""

Seems pretty close to what you ask for. You can either pull that string
apart:

py> s = repr(Pool)
py> start = s.find("'")
py> end = s.rfind("'")
py> s[start+1:end]
'multiprocessing.pool.Pool'

or you can construct it yourself:

py> Pool.__module__ + '.' + Pool.__name__
'multiprocessing.pool.Pool'


Yeah I considered doing it this way but was wary of that method because 
of possible changes to the implementation of the __repr__ method in the 
upstream code. If the Django developers don't consider the __repr__ 
method a public API then it could change in the future breaking my code.


Of course this might not happen but I was hoping that there was a more 
generic way of doing it that did not rely on a certain implementation 
being in existence.

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


Re: Getting module path string from a class instance

2012-11-13 Thread Some Developer

On 13/11/2012 08:49, Steven D'Aprano wrote:

On Tue, 13 Nov 2012 07:54:32 +0000, Some Developer wrote:


On 13/11/2012 07:19, Steven D'Aprano wrote:

On Tue, 13 Nov 2012 06:38:31 +0000, Some Developer wrote:


I'm trying to find a way to get a string of the module path of a
class.

So for instance say I have class Foo and it is in a module called
my.module. I want to be able to get a string that is equal to this:
"my.module.Foo". I'm aware of the __repr__ method but it does not do
what I want it to do in this case.

Can anyone offer any advice at all?

py> from multiprocessing.pool import Pool py> repr(Pool)
""

Seems pretty close to what you ask for. You can either pull that string
apart:

py> s = repr(Pool)
py> start = s.find("'")
py> end = s.rfind("'")
py> s[start+1:end]
'multiprocessing.pool.Pool'

or you can construct it yourself:

py> Pool.__module__ + '.' + Pool.__name__ 'multiprocessing.pool.Pool'



Yeah I considered doing it this way but was wary of that method because
of possible changes to the implementation of the __repr__ method in the
upstream code. If the Django developers don't consider the __repr__
method a public API then it could change in the future breaking my code.

I didn't call SomeClass.__repr__. That is an implementation detail of
SomeClass, and could change.

I called repr(SomeClass), which calls the *metaclass* __repr__. That is
less likely to change, although not impossible.


If you're worried, just use the second way:

SomeClass.__module__ + '.' + SomeClass.__name__
  


Ah, my mistake. Thanks. That sounds exactly like what I want.


Of course this might not happen but I was hoping that there was a more
generic way of doing it that did not rely on a certain implementation
being in existence.

SomeClass.__name__ is the official way to get the name of a class;
SomeClass.__module__ is the official way to get the name of the module or
package it comes from.

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


Re: Getting module path string from a class instance

2012-11-13 Thread Some Developer

On 13/11/2012 09:36, Dave Angel wrote:

On 11/13/2012 01:38 AM, Some Developer wrote:

I'm trying to find a way to get a string of the module path of a class.

So for instance say I have class Foo and it is in a module called
my.module. I want to be able to get a string that is equal to this:
"my.module.Foo". I'm aware of the __repr__ method but it does not do
what I want it to do in this case.

Can anyone offer any advice at all?

So you have:

import my.module
theclass = my.module.Foo
print tellme(theClass)

and you want to know how to write tellme?  Why not just change it to
take a string, and pass it  "my.module.Foo" ?

If you have stored the class away somewhere, and want to figure it out
from there, you could look at the __module__ attribute.  that'll tell
you the module name, but not the class name.


If you're really asking how to get that string from an INSTANCE of the
class, then try the __class__ attribute of that instance.

I'm actually writing a dynamic importer.

Basically when the program starts it queries all the loaded modules for 
a certain package. It then stores the module and class information in a 
database and then when a certain view is called the specific data 
required is loaded by calling importlib.import_module('module.class'). 
This then populates the view with the required data.


Basically the idea is to be able to display any data required without 
having to tightly couple the view code to a specific model type.


Thanks for the help.
--
http://mail.python.org/mailman/listinfo/python-list