Python 迭代在动态导入的模块中定义的类
我有一个动态导入的子包中的模块;如何迭代它包含的类 我一直在导入模块并列出如下名称:Python 迭代在动态导入的模块中定义的类,python,introspection,Python,Introspection,我有一个动态导入的子包中的模块;如何迭代它包含的类 我一直在导入模块并列出如下名称: package = current_module.__name__ package = package[:package.rindex(".")] # get the package package = "%s.sub.%s"%(package,name) # make the name of the child print "(loading package %s)"%package module = __i
package = current_module.__name__
package = package[:package.rindex(".")] # get the package
package = "%s.sub.%s"%(package,name) # make the name of the child
print "(loading package %s)"%package
module = __import__(package) # this succeeds
for name,obj in inspect.getmembers(module):
print name,type(obj)
这仅打印模块属性,而不打印模块定义的类类型:
__builtins__ <type 'dict'>
__doc__ <type 'NoneType'>
__file__ <type 'str'>
__name__ <type 'str'>
__package__ <type 'NoneType'>
__path__ <type 'list'>
imported_package <type 'module'>
\uuuu内置
__博士
__文件
__姓名
__包裹
__路径
进口包装
更新
似乎我的类不在\uu dict\uu
中,除非fromlist
非空!但是,from列表中的值似乎没有得到验证<代码>[“”]似乎工作正常,突然类出现了
有人能解释为什么会这样吗
(标准ubuntu python 2.7.1+(r271:86832)示例:要创建将名称映射到类的dict:
dict([(name, cls) for name, cls in mod.__dict__.items() if isinstance(cls, type)])
其中mod是加载的模块如果您在要导入的模块中定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>定义了将导出哪些符号
map(module.__dict__.get, module.__all__)
除非导入有一个fromlist子句;问题已更新,否则这不起作用。哦,还有一个次要的问题,我认为您需要在一个try块中创建issubclass?(第一)关于fromlist,您是对的:我通常使用[None]
。不知道为什么需要这样做。(第二)不,我真正的意思是isinstance
,而不是issubclass
,没有try
。每个类也是类型为“type”的对象。fromlist
需要获得您想要的,如果并且仅当您导入的模块不是顶级模块(或者更确切地说,它不包含点)。如果导入的模块名称包含点,\uuuuuu import\uuuuu
调用将返回最左侧的模块对象(如果fromlist不存在),最右侧的模块对象(如果fromlist存在)。比较\uuuu import\uuuu('pkg.mod')。\uuuuu name\uuuu
和\uuuu import\uu('pkg.mod',fromlist=“).名称:第一个是pkg
,第二个是mod
。