编程语言
首页 > 编程语言> > Python闭包,默认参数不等于使用functools.partial的解决方案?

Python闭包,默认参数不等于使用functools.partial的解决方案?

作者:互联网

我正在使用PyQt在Python 3.2中做一个小游戏.我需要在菜单操作中插入几乎相同的操作,但使用其他参数.我发现我将使用lambda做到这一点,但事实证明所有动作都具有相同的参数.

事实证明这是一个关闭问题,我根据this post在其他SO问题上解决了.但是建议的一种解决方案(带有默认参数)应该与另一种等效,不能使用.当我对打印功能进行一点测试时,两个解决方案是相等的.

我想了解它为什么在这种情况下会有所不同.连接方法会以某种方式影响它吗?它可能与python作用域有关.这是我正在做的一小段(我省略了为动作指定名称和文本):

cardsOptions = [15, 30, 45, 50, 55, 60, 10]
self.startActions = []
lambdas = []
for co in cardsOptions:
    action = QtGui.QAction(MainWindow)
    self.menuNewGame.addAction(action)
    # This works
    # action.triggered.connect(partial(self.StartGame, 8, co))

    lamb = (lambda a = co: self.StartGame(8, a))
    lambdas.append(lamb)

    # This doesn't work, when StartGame is called it gets arguments 8, false
    action.triggered.connect(lamb)
    self.startActions.append(action)

# This proves that closure was done ok, and it saved all co values
[m() for m in lambdas]

最让我惊讶的是,它把false作为第二个参数传递,就像他评估a = co一样?那么,使用默认参数的闭包与使用局部闭包的方式有何不同?

解决方法:

但是,如果您写:

[m(False) for m in lambdas]

它还将使用参数8,False调用StartGame.

Qt可能会使用参数False调用您的lambda,因此根本不使用lambda的默认参数.

但是你的想法很好.请尝试以下操作:

lamb = (lambda a, real_co = co : self.StartGame(8, real_co))

现在,只需简单地忽略False并使用real_co值.

标签:partial,closures,pyqt4,python,lambda
来源: https://codeday.me/bug/20191102/1988266.html