Python3: 使用 exec() 创建一个函数
Python3: use exec() to create a function
我正在使用 tkinter 创建一个应用程序,目前我制作了很多按钮,所以我需要用不同的命令绑定所有按钮,我想使用 exec()
来创建功能。
strategy=None
exec("global commandbutton"+str(len(strategicpoint)+1)+"\ndef commandbutton"+str(len(strategicpoint)+1)+"():\n\tglobal strategy\n\tstrategy="+str(len(strategicpoint)))
commandline=eval('commandbutton'+str(len(strategicpoint)+1))
imgx=tk.Button(win,image=towert,command=commandline)
更清洁的解决方案:
global commandbutton{...}
def commandbutton{...}():
global strategy
strategy={...}
我想要我的代码 运行 和上面一样 运行s,但后来我调用命令并测试 print(strategy)
,(我点击了 button/invoked命令)它打印 None
当我想要它打印其他东西时。
这里完全没有必要使用exec()
或eval()
。
- 函数不必按顺序命名。您也可以将函数对象存储在循环变量中,并使用该循环变量创建一个 tkinter 挂钩。
- 您可以在不使用
exec
、使用闭包或仅通过在 lambda 函数或 functools.partial()
. 中绑定参数来创建具有绑定参数的函数
所以如果你有一个递增 strategicpoint
值的循环,我会这样做:
def set_strategy(point):
global strategy
strategy = point
buttons = []
for strategicpoint in range(1, number_of_points + 1):
imgx = tk.Button(win, image=towert, command=lambda point=strategicpoint: set_strategy(point))
buttons.append(imgx)
lambda point=...
部分将当前循环值绑定为 lambda
创建的新函数对象的 point
参数的默认值。当在没有参数的情况下调用该函数时(就像单击按钮时所做的那样),新函数将使用当时分配给 strategicpoint
的整数值来调用 set_strategy(point)
.
您还可以使用闭包,即外部函数中的局部变量,供内部函数使用。每次调用外部函数时都会在外部函数中创建嵌套的内部函数,因此它们与由同一外部函数创建的其他函数对象分开:
def create_strategy_command(strategypoint):
def set_strategy():
global strategy
strategy = strategypoint
return set_strategy
然后在创建按钮时,使用:
imgx = tk.Button(win, image=towert, command=create_strategy_command(strategicpoint))
注意这里调用create_strategy_command()
函数returns一个新函数,用作按钮命令
免责声明:我还没有测试过这个。
使用字典来存储所有函数,例如:
option = "default"
def change_option(target):
global option
option = target
def f1():
print("foo")
def f2():
print("bar")
my_functions = {
"select1": f1,
"select2": f2
"default": None
}
imgx=tk.Button(win,image=towert,command=my_functions[option]) # None
swapper = tk.Button(win, image=towert, lambda: change_option("select2")) # button to change the command if you want it
imgx=tk.Button(win,image=towert,command=my_functions[option]) # print("bar")
change_option("select1")
imgx=tk.Button(win,image=towert,command=my_functions[option]) # print("foo")
你可能不用字典也能搞定,但在我看来这很干净。永远不要使用 exec() 或 eval(),除非你完全知道它有什么安全问题,你知道该产品不会在另一台机器上使用,或者你真的别无选择。
我正在使用 tkinter 创建一个应用程序,目前我制作了很多按钮,所以我需要用不同的命令绑定所有按钮,我想使用 exec()
来创建功能。
strategy=None
exec("global commandbutton"+str(len(strategicpoint)+1)+"\ndef commandbutton"+str(len(strategicpoint)+1)+"():\n\tglobal strategy\n\tstrategy="+str(len(strategicpoint)))
commandline=eval('commandbutton'+str(len(strategicpoint)+1))
imgx=tk.Button(win,image=towert,command=commandline)
更清洁的解决方案:
global commandbutton{...}
def commandbutton{...}():
global strategy
strategy={...}
我想要我的代码 运行 和上面一样 运行s,但后来我调用命令并测试 print(strategy)
,(我点击了 button/invoked命令)它打印 None
当我想要它打印其他东西时。
这里完全没有必要使用exec()
或eval()
。
- 函数不必按顺序命名。您也可以将函数对象存储在循环变量中,并使用该循环变量创建一个 tkinter 挂钩。
- 您可以在不使用
exec
、使用闭包或仅通过在 lambda 函数或functools.partial()
. 中绑定参数来创建具有绑定参数的函数
所以如果你有一个递增 strategicpoint
值的循环,我会这样做:
def set_strategy(point):
global strategy
strategy = point
buttons = []
for strategicpoint in range(1, number_of_points + 1):
imgx = tk.Button(win, image=towert, command=lambda point=strategicpoint: set_strategy(point))
buttons.append(imgx)
lambda point=...
部分将当前循环值绑定为 lambda
创建的新函数对象的 point
参数的默认值。当在没有参数的情况下调用该函数时(就像单击按钮时所做的那样),新函数将使用当时分配给 strategicpoint
的整数值来调用 set_strategy(point)
.
您还可以使用闭包,即外部函数中的局部变量,供内部函数使用。每次调用外部函数时都会在外部函数中创建嵌套的内部函数,因此它们与由同一外部函数创建的其他函数对象分开:
def create_strategy_command(strategypoint):
def set_strategy():
global strategy
strategy = strategypoint
return set_strategy
然后在创建按钮时,使用:
imgx = tk.Button(win, image=towert, command=create_strategy_command(strategicpoint))
注意这里调用create_strategy_command()
函数returns一个新函数,用作按钮命令
免责声明:我还没有测试过这个。
使用字典来存储所有函数,例如:
option = "default"
def change_option(target):
global option
option = target
def f1():
print("foo")
def f2():
print("bar")
my_functions = {
"select1": f1,
"select2": f2
"default": None
}
imgx=tk.Button(win,image=towert,command=my_functions[option]) # None
swapper = tk.Button(win, image=towert, lambda: change_option("select2")) # button to change the command if you want it
imgx=tk.Button(win,image=towert,command=my_functions[option]) # print("bar")
change_option("select1")
imgx=tk.Button(win,image=towert,command=my_functions[option]) # print("foo")
你可能不用字典也能搞定,但在我看来这很干净。永远不要使用 exec() 或 eval(),除非你完全知道它有什么安全问题,你知道该产品不会在另一台机器上使用,或者你真的别无选择。