Python 将布尔条件作为参数传递
我有这些Python 将布尔条件作为参数传递,python,Python,我有这些 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() f
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()
两个def可以合并在一起吗?它们之间唯一的区别是“==”,“!=”我假设这是一些基于事件的代码,在这种情况下,您不能直接修改事件所采用的参数数量。但是,您仍然有两种可能性: 1) 您可以检查
e
参数,以查找发生的事件类型(单击“是”或“否”按钮)。检查您正在使用的任何库的文档
2) 您可以添加第三个参数,然后在绑定事件时使用lambdas提供第三个参数(示例代码假定为Tkinter):
def MsgBox1_已选择(发件人,e,是_已选择):
如果(e.Key!=“A”)==选择了是:function0()
其他:
职能1()
职能2()
职能3()
msg_box.bind(“”,lambda s,e:MsgBox1_选择(s,e,True))
消息框绑定(“”,lambda s,e:MsgBox1_选择(s,e,False))
是的,以一种非常普遍的方式-你只需要了解以下事实:(1)函数是一级值,(2)运算符只是经过特殊语法处理的函数。例如:
def make_handler(predicate)
def handler(sender, e):
if predicate(e.Key, 'A'):
function0()
else:
function1()
function2()
function3()
return handler
使用like(导入后-您可以使用lambda执行此操作,但对于运算符,
运算符
模块是更干净的解决方案)MsgBox1\u YesChosen=make\u handler(operator.ne)
(这是一个可怕的名称,顺便说一句)。将comparison运算符作为参数传递。
您不仅可以传递运算符,还可以传递任何其他函数,但“相等”和“不相等”以及所有其他比较运算符或算术运算符都已在“运算符”模块中定义为正确的函数-您的代码可以是:
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)
这就是我要找的:)如果
==
的谓词(e.Key,A):被改为If predicate():
,你可以使用类似f1=make\u处理器(lambda:e.Key==“A”)的东西
和f2=make_处理程序(lambda:e.Key!=“A”)
--无需乱动操作符
模块。@martineau:no.e
在创建处理程序时未定义,处理程序的每次调用都不同!在这种情况下,lambda e:e.Key!=“A”工作(仍然不需要使用操作员
模块)?@martineau:你把我的答案看完了吗?是的,可以将操作符.ne
替换为lambda x:e!='a'
。我已经写过了。但是操作符
模块的唯一目的是替换这种lambda(从我收集的信息来看,它被认为是更惯用的)。是的,我读过它,你写的是“导入操作符后-你可以用lambda来做这件事”。其次,IMHO使用lambdas比使用操作符
模块更为惯用。不管怎样,这两种方法中的任何一种都比我第一次投票时意识到的要简单得多。
def make_handler(predicate)
def handler(sender, e):
if predicate(e.Key, 'A'):
function0()
else:
function1()
function2()
function3()
return handler
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)