我相信能够包装函数调用是常见的做法(至少对我来说是这样)。
例如,一个极简包装函数如下所示:
def wrap(fn, *args, **kwargs):
return fn(*args, **kwargs)
你可以通过调用任意方法
wrap(qt_method, 1, 2, foo='bar')
这相当于直接调用
qt_method(1,2, foo='bar')
这通常对我有用。但是,我遇到了一个没有的情况。
QWebView.load()
似乎不喜欢将空字典扩展到其调用签名中。例如wrap(my_webview.load, QUrl('http://istonyabbottstillprimeminister.com'))
失败,但有例外:
TypeError: QWebView.load(QUrl): argument 1 has unexpected type 'QUrl'
.
下面是一个简单的工作示例,它演示了有效和无效的东西。我还没有找到另一种无法像这样包装的 Qt 方法。
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtWebKit import QWebView
qapplication = QtGui.QApplication(sys.argv)
webview = QWebView()
url = QtCore.QUrl('http://istonyabbottstillprimeminister.com')
# basic wrapping function
def wraps(fn, *args, **kwargs):
return fn(*args, **kwargs)
args = ()
kwargs = {}
wraps(webview.load, url) # Doesn't work
webview.load(url, **kwargs) # Doesn't work
webview.load(url) # works
webview.url(*args, **kwargs) # works
webview.show()
qapplication.exec_()
QWebView
当您继承并覆盖这样的load
方法时,此问题也适用:
def load(self *args, **kwargs):
return QWebView.load(self, *args, **kwargs)
当然,如果您改为在方法签名中调用QWebView.load(self, *args)
或不使用*args, **kwargs
,那么您不会得到异常(这遵循从上面的 minimilistic 工作示例中看到的内容)
对此的任何见解将不胜感激。