如何在python中传递lambda函数中的参数?

时间:2013-05-19 11:10:13

标签: python lambda parameter-passing

我想设置一个对象的颜色,而不想为每种颜色创建10个函数。 所以,我只想声明颜色并创建10个按钮和一个功能。错误信息是:

<lambda>() missing 1 required positional argument: 'green'

代码:

from tkinter import *

green=["#5bd575","#55c76d"]
#different colors should follow here

root=Tk()
Btn=Button(text="Trigger lambda", command=lambda green: printfunction(green))
Btn.pack()

def printfunction(colorset):
    print(colorset)

它不需要是lambda函数,问题是,如何通过单击按钮调用带有参数的printfunction

2 个答案:

答案 0 :(得分:2)

command callable不会使用任何参数。如果您想将green列表传递到printfunction,只需省略参数,lambda就不需要它了:

Btn=Button(text="Trigger lambda", command=lambda: printfunction(green))

现在lambda内的green指的是全局。

如果您只想使用预定义的参数调用printfunction,则可以使用functools.partial() function;你传递了要调用的函数加上需要传入的任何参数,并且当调用它的返回值时,它就会这样做;使用您指定的参数调用该函数:

from functools import partial

Btn=Button(text="Trigger lambda", command=partial(printfunction, green))

答案 1 :(得分:0)

Python非常动态,您可以在定义后修改类或创建本地函数。例如:

class X:
    # generic print function
    def print_color(self, color):
        pass

# dictionary with colors to support
COLORS = {'green': ["#5bd575","#55c76d"]}

# attach various print functions to class X
for name, value in COLORS.items():
    def print_color_x(self, value=value):
        self.print_color(value)
    setattr(X, 'print_color_{}'.format(name), print_color_x)

请注意value=value默认参数。这是在每次迭代中绑定值所必需的。没有它,value的查找将在调用函数时发生,给出错误的全局value错误或者找到它碰巧在那里找到的随机错误,但不会找到你的那个想。如果允许创建正确的成员函数而不仅仅是静态函数,则使用functools.partial()可能更清晰。请注意,文档中提到的示例纯Python实现允许创建成员函数,因此使用它作为替换是一个选项。