使用模块别名在各种实现之间切换

时间:2016-10-23 17:30:25

标签: python python-3.x

我正在尝试找到一种自然的机制,以实现在同一界面的各种实现之间的“编译时”切换(相同的'duck-type')。

假设我有两个带有一些工厂函数的类:

class Number1(object)
    ...

def fromBytes(byteArray):
    ...

class Number2(object)
    ...

def fromBytes(byteArray):
    ...

分别在Number1.pyNumber2.py中定义,它们实现相同的功能。我想编写以下面的import语句开头的客户端代码:

import Number

其中我的Number.py模块只是一个文件,其中选择了实现(在Number1Number2之间)。我最初想要取消Number.py和:

import Number1 as Number

在我的客户端代码中。但是,我希望在项目的单个位置指定我选择的实现,而不是在多个客户端模块中复制该选项。

我想如下定义Number.py

# choose your implementation here
import Number1
Number = Number1

然而,这个解决方案迫使我让我的客户端模块以:

开头
from Number import Number

看起来不太好。我想要一个简单的import Number,然后将我的工厂函数称为Number.ZERONumber.fromBytes(...)例如...... pythonic方法是什么?

1 个答案:

答案 0 :(得分:3)

使用通配符导入可能是解决问题的最简单方法。

<强> Number.py:

if use_module_1:
    from Number1 import *
else:
    from Number2 import *

在所有客户端代码中:

import Number
# or
from Number import some_name

虽然通配符导入通常被认为是一种不好的做法,但这不是一个例子,因为您实际上希望使用来自Number或{{{{}}的所有元素污染Number1命名空间1}}。