2

假设我有 2 个具有统一(相同)接口的不同模块。文件列表如下:

root/
   logic.py
   sns_api/
      __init__.py
      facebook/
          pyfacebook.py
          __init__.py
      myspace/
          pymyspace.py
          __init__.py

并且 pyfacebook.py 和 pymyspace.py 具有相同的接口,这意味着:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

# in pymyspace.py
class Myspace:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

现在我有一个问题。我想在 logic.py 中执行逻辑而不复制代码,所以我想知道如何设置一个标志来显示我使用的模块,python 将自动加载正确的代码,这意味着:

# in logic.py

PLATFORM = "facebook"

# import the right modules in, complete the logic with the current platform
# create the right instance and invoke the right methods

然后我更改 PLATFORM = 'myspace',逻辑将自动运行。

那么我该怎么做呢?

我想知道使用动态导入是否可行,或者评估原始 python 代码,但似乎不是一个好的解决方案。或者如果我可以制作一个统一的包装纸

sns_api/__init__.py

任何人都可以帮忙吗?

4

3 回答 3

6

只有两个我会做

if platform == 'facebook':
    from pyfacebook import FaceBook as Platform
elif platform == 'myspace':
    from pymyspace import Myspace as Platform
else:
    raise RuntimeError, "not a valid platform"

Platform在其余代码中使用。在库中是这样完成的,请参阅os模块。

您可以使用 进行真正的动态导入,但您可能不需要它。name =__import__('module')

于 2009-10-22T12:58:11.147 回答
0

在每个模块中都有一个“工厂”功能,动态导入并为加载的模块调用工厂。至少,这是一种方法。请记住,pythonic 方式是“鸭子类型”,因此工厂返回一个对象,客户端通过“鸭子调用”使用它:-)

于 2009-10-22T12:48:49.990 回答
0

您还可以使用 exec:

exec "from sns_api.%s import Platform" % PLATFORM

然后在你的实现文件中,为平台分配一些东西:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

Platform = Facebook
于 2009-10-22T17:51:10.727 回答