有没有办法只从Python模块导入特定的预定义类列表?例如,假设我在同一目录中有模块a.py
和b.py
,并带有以下代码:
#a.py
class Foo(object):
'''definition of class Foo goes here'''
class Bar(object):
'''definition of class Bar goes here'''
aTypes = [Foo, Bar]
_
#b.py
from a import aTypes
print Foo
当然,运行b.py
会导致print Foo
行提升NameError
。我并不认为这会起作用(b.py
中的import语句为我提供a.Foo
类型而不是Foo
类型),但我无法理解出正确的语法。是否有from a import aTypes
的替代方案可以提供所需的行为?
答案 0 :(得分:4)
您可以直接导入名称:
from a import Foo, Bar
或者,您可以在a.py
中定义__all__
:
__all__ = ['Foo', 'Bar']
然后在b.py
中执行通配符导入:
from a import *
虽然只有两个名字,但使用第一个解决方案会更容易。
答案 1 :(得分:1)
假设你确实需要这样做(处理类型列表)并且不能使用__all__
这样的技巧只能工作一次(每个模块一个这样的特殊列表),然后:
def gettypes(types):
thismodule = sys.modules[__name__]
for t in types:
setattr(thismodule, t.__name__, t)
像这样使用:
import a
gettypes(a.aTypes)
我发现很难想象你为什么需要这个,但这不是我的问题; - )
注意__name__
的使用意味着这对符号一般不起作用,只适用于类,模块,函数和我忘记的任何其他内容(或者对于自己的设计有__name__
)。它也不会为你在模块中存在别名的东西工作,例如在模块中编写Baz = Bar
然后在列表中使用Baz
。如果列表是['Foo', 'Bar']
而不是[Foo, Bar]
,并且您还将源模块传递到gettypes
,那么您可以避免这些限制。
答案 2 :(得分:0)
您可以在__all__
的模块级别定义a.py
:
__all__ = ['Foo', 'Bar']
这将允许您以下列方式导入它:
from a import *
当然,并不总是鼓励这种行为,首选备选方案:
from a import Foo, Bar