gpt4 book ai didi

Python:如何使用 lambda 或 partial 来绑定(bind)第一个位置参数以外的参数

转载 作者:太空狗 更新时间:2023-10-30 00:17:59 24 4
gpt4 key购买 nike

在尝试使用 lambdafunctools.partial 从现有函数创建一个绑定(bind)位置参数的新函数时,我遇到了很多困惑。

我想做这样的事情(这不是我想要的):

def addFunction(self, name, in_function, secondary_args=None, secondary_kwargs=None):

# Assign the function with optional args based on whether any
# optional args are not None

if secondary_args is not None and secondary_kwargs is not None:
func = lambda x: in_function(x, *secondary_args, **secondary_kwargs)
elif secondary_args is None and secondary_kwargs is not None:
func = lambda x: in_function(x, **secondary_kwargs)
elif secondary_args is not None and secondary_kwargs is None:
func = lambda x: in_function(x, *secondary_args)
else:
func = in_function
###

func.__doc__ = in_function.__doc__
self[name] = func # <-- This method is a class method for something deriving dict.

我还尝试用等效的 functools.partial 语句替换所有 lambda 语句。

问题是如果我这样使用这个函数:

# Assume some_function takes 3 arguments, a float, a Bool, and a String,
# in that order.

someObject.addFunction("my_f", some_function, secondary_args=[True, "Option_A"])

现在,当我尝试使用(仅作为示例)someObject["my_f"](5.0) 时,它会在我调试它时报告第一个参数为 True

似乎绑定(bind),无论是使用 lambda 还是使用 partial 都只是简单地插入位置参数,或者只在 的末尾接受额外的位置参数*args 或者只是放弃它(我不确定是哪个)。

对于我的应用程序,由于许多函数将存储在像这样的特定对象中,并且用户选择了不同数量的可选参数,所以我返回的带有绑定(bind)参数的函数仍然接受用户的参数是很重要的作为第一个位置参数,无需强制所有参数成为关键字参数。

这看起来应该很简单。我错过了什么?

最佳答案

你能发布一个完整的脚本来重现错误吗?因为以下脚本按预期工作:

class C(dict):                                                               
def addFunction(self, name, in_function, secondary_args=None, secondary_kwargs=None):

# Assign the function with optional args based on whether any
# optional args are not None

if secondary_args is not None and secondary_kwargs is not None:
func = lambda x, *secondary: in_function(x, *secondary_args, **secondary_kwargs)
elif secondary_args is None and secondary_kwargs is not None:
func = lambda x: in_function(x, **secondary_kwargs)
elif secondary_args is not None and secondary_kwargs is None:
func = lambda x: in_function(x, *secondary_args)
else:
func = in_function
###

func.__doc__ = in_function.__doc__
self[name] = func # <-- This method is a class method for something deriving dict.


def f(x, y=0, z=1):
print x, y, z


c = C()
c.addFunction('my_f', f, secondary_args=[-1])
c['my_f'](0)

# output is 0 -1 1, as expected

也许问题在于您如何将函数“附加”到您的对象?

关于Python:如何使用 lambda 或 partial 来绑定(bind)第一个位置参数以外的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11831177/

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