代码之家  ›  专栏  ›  技术社区  ›  00__00__00

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

  •  0
  • 00__00__00  · 技术社区  · 7 年前

    有一个库,我正在使用两个不同版本的。

    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)
    

    这是蟒蛇式的方法吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   bruno desthuilliers    7 年前

    Python函数是对象,是其模块的属性,因此您可以在启动时(即在主脚本中)对模块进行一次monkeypatch:

    # this has to be executed BEFORE any use of `mylib.myfun`
    import mylib
    
    def patch_myfun():
        realfun = mylib.myfun
    
        if mylib.version < needed:
            # Env 1
            def patched(*args, extra_arg=None):
                return realfun(*args)
        else:
            # Env 2
            def patched(*args, extra_arg=None):
                return realfun(*args, extra_arg=extra_arg)
    
        mylib.myfun = patched
    
    
    patch_my_fun()
    

    注意:当然,每个进程只能执行一次此代码(否则 myfun mylib.myfun sys.modules .

        2
  •  1
  •   Ihor Voronin    7 年前

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

    并检查:

    >>> 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
    
    推荐文章