我有这些
def MsgBox1_YesChosen(sender,e):
if e.Key != "A": function0()
else:
function1()
function2()
function3()
def MsgBox1_NoChosen(sender,e):
if e.Key == "A": function0()
else:
function1()
function2()
function3()
可以将两者合并在一起吗?它们之间唯一的区别是“==”,“!=”
答案 0 :(得分:4)
是的,以一种非常普遍的方式 - 你只需要围绕以下事实:(1)函数是一等值,(2)运算符只是具有特殊句法处理的函数。例如:
def make_handler(predicate)
def handler(sender, e):
if predicate(e.Key, 'A'):
function0()
else:
function1()
function2()
function3()
return handler
使用like(在导入operator
之后 - 你可以使用lambda执行此操作,但对于运算符,operator
模块是更清洁的解决方案)MsgBox1_YesChosen = make_handler(operator.ne)
(这是一个可怕的名称btw)。
答案 1 :(得分:1)
def MsgBox1_WhatIsChosen(sender, e, yesOrNo):
if (e.Key != 'A') == yesOrNo:
function0()
else:
function1()
function2()
function3()
def MsgBox1_YesChosen(sender,e):
return MsgBox1_WhatIsChosen(sender, e, True)
def MsgBox1_NoChosen(sender,e):
return MsgBox1_WhatIsChosen(sender, e, False)
答案 2 :(得分:1)
将comparisson运算符作为参数传递。 您不仅可以传递一个运算符,还可以传递任何其他函数 - 但是“相等”和“不相等”,以及所有其他比较算术运算符都已经被定义为“运算符”模块中的正确函数 - 您的代码可以成为:
import operator
def MsgBox1_Action(sender,e, comparisson):
if comparisson(e.Key, "A"): function0()
else:
function1()
function2()
function3()
MsgBox1_YesChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.eq)
MsgBox1_NoChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.ne)
答案 3 :(得分:0)
我假设这是一些基于事件的代码,在这种情况下,您无法直接修改事件所需的参数数量。但是,您仍有两种可能性:
1)您可以检查e
参数以查找发生的事件类型(是或否按钮单击)。查看您正在使用的库的文档。
2)您可以添加第三个参数,然后在绑定事件时使用lambdas提供第三个参数(示例代码假设为Tkinter):
def MsgBox1_Chosen(sender, e, yes_chosen):
if (e.Key != "A") == yes_chosen: function0()
else:
function1()
function2()
function3()
msg_box.bind('<Event-Yes>', lambda s,e: MsgBox1_Chosen(s,e,True))
msg_box.bind('<Event-No>', lambda s,e: MsgBox1_Chosen(s,e,False))