python - 加载不同的模块而不改变逻辑文件

标签 python interface dynamic-import

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

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

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

# 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

有人可以帮忙吗?

最佳答案

只要两个我就可以

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'),但您可能不需要这个。

关于python - 加载不同的模块而不改变逻辑文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606960/

相关文章:

c# - 访问修饰符和继承

ecmascript-6 - ES6 中带有运行时变量的动态导入

java - 使用 Java 接口(interface)来表示名词和形容词是否正确?

java jackson |如何序列化指定具体接口(interface)的对象

angular - 在 Angular 8 中动态加载 json

node.js - 在 Node.js 中动态导入 webpack

python - 在 python 中使 itertools.combinations 计算多进程?

python - 如何解释python3的帮助输出?

python - 如何在 python3 中创建列表列表?

在 __init__ 中定义和设置的 Python 模拟属性