【问题标题】:Iterate the classes defined in a module imported dynamically迭代动态导入的模块中定义的类
【发布时间】:2011-11-26 22:02:20
【问题描述】:

我有一个动态导入的子包中的模块;如何迭代它包含的类?

我一直在导入模块并列出这样的名称:

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'>

更新

看来我的课程不在__dict__除非fromlist 不为空!来自列表中的值似乎没有经过验证; [""] 似乎工作得很好,突然课程出现了!

谁能解释这是为什么?

(标准 ubuntu python 2.7.1+ (r271:86832)

【问题讨论】:

    标签: python introspection


    【解决方案1】:

    示例:创建一个将名称映射到类的字典:

    dict([(name, cls) for name, cls in mod.__dict__.items() if isinstance(cls, type)])
    

    mod 是加载的模块

    【讨论】:

    • 这不起作用,除非导入有 fromlist 子句;问题已更新。
    • 哦,我认为你在 try 块中不适合 issubclass 吗?
    • (首先)你对 fromlist 的看法是正确的:我通常使用[None] 来表示。不知道为什么有必要。 (第二)不,我的意思是isinstance,不是issubclass,也没有try。每个类也是“类型”类型的对象。
    • fromlist 需要当且仅当您导入的模块不是顶级模块(或者更确切地说,它不包含点)时才能获得所需的内容。如果导入的模块名称包含点,如果 fromlist 不存在,__import__ 调用将返回最左边的模块对象,如果 fromlist 存在,则返回最右边的模块对象。比较__import__('pkg.mod').__name____import__('pkg.mod', fromlist="").__name__:第一个是pkg,第二个是mod
    【解决方案2】:

    如果您在要导入的模块中定义__all__,它定义了将导出哪些符号,您可以通过专门选择这些项目进行迭代。

    map(module.__dict__.get, module.__all__)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多