過去に問題なくデコレータを使用しましたが、これにこだわっています。私の装飾された関数が PyQt アクションによって呼び出されると、失敗するようです。私の理論では、PyQt が接続された関数を何らかの方法で内部的にラップし、署名などをいじっていますが、これを示す証拠は見つかりません。
接続とは、次のような意味です。
from PyQt4 import QtGui
# In my widget init...
self.action_my_method = QtGui.QAction("action_my_method", self)
self.action_my_method.triggered.connect(self.my_method)
ここに私の単純なデコレータがあります:
from functools import wraps
def simple_decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
from inspect import getargspec
print getargspec(fn)
return fn(*args, **kwargs)
return wrapper
これを使用して引数なしでメソッドを装飾し ( def my_method(self)
)、QWidget クラスから直接実行すると、正常に動作します。メニューを使用してアクションをトリガーすると、次のようになります。
# Traceback (most recent call last):
# File "[...].py", line 88, in wrapper
# return fn(*args, **kwargs)
# TypeError: my_method() takes exactly 1 argument (2 given)
私は引数仕様を見ています:
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
メソッドに追加*args
すると、シグネチャはmy_method(self, *args)
になり、デコレータは正常に動作し、引数の仕様は次のようになります。
ArgSpec(args=['self'], varargs='args', keywords=None, defaults=None)
デコレータは直接呼び出された場合は正常に動作しますが、アクションによってトリガーされた場合は失敗するため、ここには手がかりがありません。
誰かがこれに光を当てたり、さらにデバッグするために使用できるものを提供したりできますか?