给定一个带有函数名的列表,将它们作为函数添加到模块中,以便可以使用函数名作为参数从模块中调用它们。
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__
永远不会被调用,我无法获得实例变量。
答案 0 :(得分:0)
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。