编辑:我应该指定我正在(卡住)使用Python 2,但是我想看看如何在2或3中解决这个问题
场景:
我有一个名为shapes的包。
我在shapes中有一个名为factory的模块,它有一个ShapeClassFactory类。
这个类可以被传递一个字符串,它将在远程数据库中查找数据,并使用它动态地定义一个类,它将返回该类。
形状.py:

from .factory import ShapeClassFactory
__all__ = ['ShapeClassFactory']

实际上,这个包可以用于各种其他包和脚本,例如:
from shapes import ShapeClassFactory

Circle = ShapeClassFactory("Circle")
Rect = ShapeClassFactory("Rect")

myCircle = Circle(r=5, fill='red')
mySquare = Rect(x=5, y=5, fill=None)

问题是:
以上都很好。但是,我希望能够以这样的方式编写shapes包:
from shapes import Circle, Rect

myCircle = Circle(r=5, fill='red')
mySquare = Rect(x=5, y=5, fill=None)

…其思想是,如果在shapes中找不到该成员,则使用ShapeClassFactory尝试生成该成员。
困难在于,在请求之前,可用的类基本上是未知的,因此预定义的类名列表没有帮助。
如果ImportError未能构建类,我不介意抛出ShapeClassFactory,但这样的事情是否可能?

最佳答案

只要不存在太多可能的类,并且预先初始化类的成本不太高,就可以在初始化时在shapes命名空间中自动构造所有可能的对象。您可以在shapes.py中使用这样的代码:

from .factory import ShapeClassFactory

__all__ = ['ShapeClassFactory']

def get_shape_names():
    """Returns all valid shapes that can be passed in to ShapeClassFactory"""
    return ['Circle', 'Rect']  # your own code should query the database

for name in get_shape_names():
    globals()[name] = ShapeClassFactory(name)
    __all__.append(name)

关于python - Python中的魔术导入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46477383/

10-09 05:10