以编程方式创建功能规范

对于我自己的娱乐,我想知道如何实现以下目标:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章