gpt4 book ai didi

Python - 变量定义的参数的确切数量

转载 作者:太空狗 更新时间:2023-10-30 01:54:17 25 4
gpt4 key购买 nike

我正在创建一个方法,该方法构造一个匿名方法以返回多个变量的函数,例如f(x, y, z) = b。我希望用户能够传递变量列表:

def get_multivar_lambda(expression, variables=["x"])

然后我希望返回的匿名函数完全采用 len(variables) 参数(基于列表索引的位置或基于列表中字符串的关键字)。我知道我可以使用 *args 并检查长度,但这似乎不够优雅。

这可能吗?我该怎么做?

这是我如何对一个变量执行此操作的示例(其中 seval 是来自模块 simple_eval 的一个):

def get_lambda(expression, variable="x"):                                       
return lambda arg: seval(expression.replace(variable, str(arg)))

这是我通过检查传递的 arguments* 的长度来做到这一点的方法:

def get_multivar_lambda(expression, variables=["x"]):

def to_return(*arguments):
if len(variables) != len(arguments):
raise Exception("Number of arguments != number of variables")
for v, a in zip(variables, arguments):
expression.replace(v, a)
return seval(expression)

return to_return

编辑:我正在从用户输入中获取表达式和变量,因此最好采用安全的方法来执行此操作。

最佳答案

如果你可以使用 Python 3,那么新引入的(Python 3.3+)inspect.Signatureinspect.Parameter可以使您的代码非常干净(PEP 362 - Function Signature Object)。这些在装饰器中也非常方便:

from inspect import Parameter, signature, Signature

def get_multivar_lambda(expression, variables=["x"]):

params = [Parameter(v, Parameter.POSITIONAL_OR_KEYWORD) for v in variables]
sig = Signature(params)

def to_return(*args, **kwargs):
values = sig.bind(*args, **kwargs)
for name, val in values.arguments.items():
print (name, val)

to_return.__signature__ = signature(to_return).replace(parameters=params)
return to_return

演示:

>>> f = get_multivar_lambda('foo')
>>> f(1)
x 1
>>> f(1, 2)
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
...
raise TypeError('too many positional arguments') from None
TypeError: too many positional arguments
>>> f(x=100)
x 100

也会为用户产生有用的错误信息:

>>> g = get_multivar_lambda('foo', variables=['x', 'y', 'z'])
>>> g(20, 30, x=1000)
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
....
TypeError: multiple values for argument 'x'
>>> g(1000, y=2000, z=500)
x 1000
y 2000
z 500

用于内省(introspection)目的的函数签名:

>>> inspect.getargspec(g)
ArgSpec(args=['x', 'y', 'z'], varargs=None, keywords=None, defaults=None)

关于Python - 变量定义的参数的确切数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670661/

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