How do you map the full name of a class to its class in Python?

You can get the fully qualified class name of a Python object like this (see this question ):

>>> import Queue >>> q = Queue.PriorityQueue() >>> def fullname(o): return o.__module__ + "." + o.__class__.__name__ ... >>> fullname(q) 'Queue.PriorityQueue' >>> 

How do you do the opposite, i.e. map the full class name, for example 'Queue.PriorityQueue' , to its associated class object ( Queue.PriorityQueue )?

+8
python introspection
source share
3 answers

You can use importlib in version 2.7:

 from importlib import import_module name = 'xml.etree.ElementTree.ElementTree' parts = name.rsplit('.', 1) ElementTree = getattr(import_module(parts[0]), parts[1]) tree = ElementTree() 

In older versions, you can use the __import__ function. It by default returns the top level of package import (e.g. xml ). However, if you pass it a nonempty fromlist , it instead returns a named module:

 name = 'xml.etree.ElementTree.ElementTree' parts = name.rsplit('.', 1) ElementTree = getattr(__import__(parts[0], fromlist=['']), parts[1]) tree = ElementTree() 
+10
source share

For Python 2.6 / 2.7

 import sys def hasModule(moduleName): return moduleName in sys.modules def getModule(moduleName): if hasModule(moduleName): return sys.modules[moduleName] def loadModule(moduleName): if not hasModule(moduleName): return __import__(moduleName) return getModule(moduleName) def createInstance(fqcn, *args): paths = fqcn.split('.') moduleName = '.'.join(paths[:-1]) className = paths[-1] module = loadModule(moduleName) if module is not None: return getattr(module, className)(*args) pq = "Queue.PriorityQueue" pqObj = createInstance(pq) pqObj.put(1) print pqObj.get() #1 
+1
source share

Identifiers in Python are not really meant to be used that way, but with sys.modules and __import__ you can achieve what you want.

 import sys def get_by_qualified_name(name): parts = name.split(".") module_name = parts[0] attribute_names = parts[1:] if module_name not in sys.modules: __import__(module_name) result = sys.modules[module_name] for attribute_name in attribute_names: result = getattr(result, attribute_name) return result 
Usage example
 my_queue = get_by_qualified_name("Queue.Queue")() my_queue.put("Hello World") print my_queue.get() # prints "Hello World" 

This will happen if the module is in a package that does not import it as part of __ALL__ . This can be fixed, but it requires more complex use of __import__ .

0
source share

All Articles