【问题标题】:Using a dictionary of functions with variable number of arguments - can I use partial here?使用具有可变数量参数的函数字典 - 我可以在这里使用 partial 吗?
【发布时间】:2021-07-24 10:09:43
【问题描述】:

如果我有一个函数字典,例如:

func_dict = {
    "sum": lambda x, y: x + y,
    "multiply": lambda x, y: x * y,
    "double": lambda x: x*2
}

func_dict["sum"](1, 2)
# outputs 3

# cannot do
[func_dict[i](x, y) for i in list_of_funcs_to_run]

每个都采用相似但数量略有不同的参数,我收集(来自例如[here][1])我可以使用functools.partial 将字典定义为:

y = 1 # or whatever
func_dict = {
    "sum": partial(lambda x, y: x + y, y=y),
    "multiply": partial(lambda x, y: x * y, y=y),
    "double": lambda x: x*2
}

func_dict["sum"](1)
# outputs 3

# now can do
[func_dict[i](x) for i in list_of_funcs_to_run]

我现在有一种情况,1)有多个 xs 和 ys 存储在一个列表中(这样我可以运行 [sum(i,j) for i,j in zip(x,y)]),但我不一定知道字典时的值被实例化(例如函数字典可能是类属性,我需要在制定xy 列表后在类方法中调用字典)。

有没有办法我仍然可以在这里使用partial(或其他方法)来保存变量参数的字典并像[func_dict[i](x) for i in list_of_funcs_to_run] 一样一举调用所有函数?我只能想到每次创建新的xy 变量时都声明函数字典,例如

for i in list_of_funcs_to_run:
   x = ...
   y = ... 
   func_dict = ... # define func_dict with partials here
   [func_dict[i](x) for i in list_of_funcs_to_run]

谢谢! [1]:Calling functions with parameters using a dictionary in Python

【问题讨论】:

  • 我不确定我是否理解...您有一个 (x, y) 对的列表(或者更确切地说,多个这样的列表)。 partial 的动机是“锁定”一个固定的 y,还是只是想运行整个列表中的所有函数,而忽略 y 的不需要它的函数?
  • 您可以在“double” lambda 中添加一个未使用的参数,以便您的所有 lambda 接受两个参数? "double": lambda x, _: x*2
  • @CrazyChucky 是的,我有多个 (x,y) 对,我想知道是否有一种干净的方法可以为每对调用多个函数,而不必单独写出所有函数。将函数放入字典是一种方法,但我还想考虑可变数量的参数。这有意义吗?
  • @IainShelvington 我可以,但我认为这可能会混淆某些函数(在现实生活中,函数没有意义的情况下接受参数y)。只是想知道是否有比为每个 x,y 对分别调用每个函数更简洁的方法
  • 向函数添加未使用的参数比在循环 IMO 中生成部分函数“更干净”

标签: python


【解决方案1】:

您可以改为让所有 lambdas/函数接受相同数量的参数来修复您的第一个用例,而不是动态创建部分函数。

func_dict = {
    "sum": lambda x, y: x + y,
    "multiply": lambda x, y: x * y,
    "double": lambda x, _: x*2
}

我们将未使用的第二个参数添加到“双”lambda。使用_ 作为参数名称是未使用/忽略参数的约定

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2018-08-14
    • 2021-08-18
    • 2022-11-14
    • 2021-10-29
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多