Python 连接部分函数

Python 连接部分函数,python,pyqt5,Python,Pyqt5,我有一门课是这样的: class Controller: def __init__(self, view): self._view = view self._connectSignals() def _buildExpression(self, sub_exp): expression = self._view.displayText() + sub_exp self._view.setDisplay

我有一门课是这样的:

class Controller:
    def __init__(self, view):   
        self._view = view
        self._connectSignals()
    
    def _buildExpression(self, sub_exp):
        expression = self._view.displayText() + sub_exp
        self._view.setDisplayText(expression)
    
    def _connectSignals(self):
        for btnText, btn in self._view.btns.items():
            if btnText not in {'=', 'C'}:
                    btn.clicked.connect(partial(self._buildExpression,btnText))        
        self._view.btns['C'].clicked.connect(self._view.clearDisplay)
            
为什么要使用这一行代码:

btn.clicked.connect(partial(self._buildExpression,btnText)) 
无法转换为此行:

btn.clicked.connect(self._buildExpression(btnText))

相反,这里有一个错误——“参数1具有意外的类型‘NoneType’”

要理解差异,您必须理解:

btn.clicked.connect(self._buildExpression(btnText))
相当于:

val = self._buildExpression(btnText)
btn.clicked.connect(val)
btn.clicked.connect(None)
如您所见,
val
是函数返回的值,它是None,因此代码也等价于:

val = self._buildExpression(btnText)
btn.clicked.connect(val)
btn.clicked.connect(None)
显然,上面的代码会抛出一个异常,因为connect需要一个可调用的,但得到的却是None

另一方面,还应该注意的是_buildExpression方法是在创建连接之前计算的,这是您不想要的,因为您想要的是在发出信号时对其进行计算


而不是
functools.partial
创建一个新函数,在其中传递参数,类似于:

def new_函数():
self.\u buildExpression(btnText)
点击连接(新功能)

非常感谢:)欢迎来到Stack Overflow!如果你描述了你为解决问题所采取的步骤,包括你所做的研究,你就更有可能得到答案。在此处查看如何就SO提出一个好问题: