gpt4 book ai didi

python - 以编程方式创建函数规范

转载 作者:太空狗 更新时间:2023-10-29 17:18:57 25 4
gpt4 key购买 nike

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

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 构造恶意值。

关于python - 以编程方式创建函数规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com