对于我自己的娱乐,我想知道如何实现以下目标:
functionA = make_fun(['paramA', 'paramB'])
functionB = make_fun(['arg1', 'arg2', 'arg3'])
相当于
def functionA(paramA, paramB):
print(paramA)
print(paramB)
def functionB(arg1, arg2, arg3):
print(arg1)
print(arg2)
print(arg3)
这意味着需要以下行为:
functionA(3, paramB=1) # Works
functionA(3, 2, 1) # Fails
functionB(0) # Fails
问题的焦点在变量argspec上-我喜欢使用常规装饰器技术来创建函数体。
对于那些感兴趣的人,我一直在尝试以编程方式创建类似以下的类。同样,困难在于生成__init__
带有编程参数的方法-使用装饰器或元类,类的其余部分看起来很简单。
class MyClass:
def __init__(self, paramA=None, paramB=None):
self._attr = ['paramA', 'paramB']
for a in self._attr:
self.__setattr__(a, None)
def __str__(self):
return str({k:v for (k,v) in self.__dict__.items() if k in self._attributes})
您可以用来exec
从包含Python代码的字符串构造函数对象:
def make_fun(parameters):
exec("def f_make_fun({}): pass".format(', '.join(parameters)))
return locals()['f_make_fun']
例子:
>>> f = make_fun(['a', 'b'])
>>> import inspect
>>> print(inspect.signature(f).parameters)
OrderedDict([('a', <Parameter at 0x1024297e0 'a'>), ('b', <Parameter at 0x102429948 'b'>)])
如果您需要更多功能(例如,默认参数值),则需要修改包含代码的字符串并使其代表所需的函数签名。
免责声明:如下所述,重要的是要验证的内容,parameters
并确保将生成的Python代码字符串安全地传递给exec
。您应该构建parameters
自己或施加限制以防止用户构建的恶意价值parameters
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句