在两个具有不同库函数签名的不同环境中运行的相同代码

时间:2018-12-11 10:49:45

标签: python function environment fixtures

我需要在两个不同的python环境中运行一些代码。 有一个库,我使用的是两个不同版本。

Env1.
mylib.myfun(*args) # as expected
mylib.myfun(*args,extra_arg=val) # raise error

Env2.
mylib.myfun(*args) # raise warning
mylib.myfun(*args,extra_arg=val) # as expected

理想情况下,我想在两个环境中运行相同的代码并获得相同的结果。 我当时想摆脱固定装置

def fix_myfun():
    if mylib.version<needed:
       mylib.myfun(*args)
    else:
       mylib.myfun(*args)

这是这样做的Python方式吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试检查支票版本:

>>> import re
>>> print re.__version__
2.2.1
>>> re.__version__ == "2.2.1"
True

然后检查:
(这里显示了如何检查2.2.2版和最新版本。)

>>> bool(re.match(r"2.2.(?:[2-9]|\d\d\d*)", re.__version__))
False
>>> bool(re.match(r"2.2.(?:[2-9]|\d\d\d*)", "2.2.2"))
True

答案 1 :(得分:1)

Python函数是对象,并且是其模块的属性,因此您只需在启动时(即在您的主脚本中)对模块进行一次猴子修补:

myfun

注意:此代码在每个过程中只能执行一次(否则mylib.myfun将被修补多次)。确保这一点的最佳方法是将其放在脚本的顶部,或者放在任何使用sys.modules之前导入的模块中-对于模块,顶层代码仅执行一次(每个进程)第一次导入模块时,随后的导入将仅从- hosts: localhost gather_facts: no vars: x: a y: 1 a1b: 'super_variable' tasks: - name: templating template: src: test.j2 dest: tmp.j2 中检索已加载的模块。