在Python

时间:2018-06-16 05:22:55

标签: python python-3.x

给定一个带有函数名的列表,将它们作为函数添加到模块中,以便可以使用函数名作为参数从模块中调用它们。

from package import module_name

Functions = [ 'Add', 'Subtract' ]

for function in Functions:
  def api_endpoint(*args):
    return module_name.api(function, *args)

  setattr(module_name, function, api_endpoint)

我希望能够拨打module_name.Add(arg1, arg2)并调用module_name.api('Add', arg1, arg2)

如何传递这种内省并动态地向模块添加功能?我尝试以这种方式进行设置,但是对module_name.Add的任何调用总是调用函数中的最后一项(例如Subtract),这是不正确的。

我尝试使api_endpoint成为一个覆盖__new__的类,但这没有帮助,因为如果__new__没有返回正在创建的类的实例,则__init__永远不会被调用,我无法获得实例变量。

1 个答案:

答案 0 :(得分:0)

使用functools.partial

from functools import partial
from TestPackage import TestModule

Functions = [ 'Add', 'Subtract' ]

for function in Functions:
    p = partial(TestModule.api, function)
    setattr(TestModule, function, p)


TestModule.Add(1,2)         # Add 1 2
TestModule.Subtract(3,4)    # Subtract 3 4

TestModule只包含:

def api(func, *args):
    print(func, *args)

或者,利用如何评估参数:

from TestPackage import TestModule

functions = [ 'Add', 'Subtract' ]

for fn in functions:
    def api_endpoint(*args, fn=fn):               # Added 'fn=fn'
        return TestModule.api(fn, *args)

    setattr(TestModule, fn, api_endpoint)


TestModule.Add(1,2)         # Add 1 2
TestModule.Subtract(3,4)    # Subtract 3 4

或者,使用闭包(不是一个巨大的粉丝,特别是与第一个相比):

from TestPackage import TestModule

functions = [ 'Add', 'Subtract' ]

for fn in functions:
    def bind_fn(fn):
        def api_endpoint(*args):
            return TestModule.api(fn, *args)

        return api_endpoint

    setattr(TestModule, fn, bind_fn(fn))


TestModule.Add(1,2)         # Add 1 2
TestModule.Subtract(3,4)    # Subtract 3 4

编辑:您的方法使用“Subtract”作为传递的func(对于两个调用)的原因是explained here