1

過去に問題なくデコレータを使用しましたが、これにこだわっています。私の装飾された関数が 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)

デコレータは直接呼び出された場合は正常に動作しますが、アクションによってトリガーされた場合は失敗するため、ここには手がかりがありません。

誰かがこれに光を当てたり、さらにデバッグするために使用できるものを提供したりできますか?

4

2 に答える 2

1

これは答えではなく、回避策です。これにマイナス面がないことを願っています。簡単なリダイレクト機能を入力しているときに考えました。これはラムダを使用して、実行時に同じことを行います。

self.action_my_method.triggered.connect(lambda: self.my_method())

これにより、装飾された関数が壊れないように十分にパディングされ、エラーが防止されます。

于 2012-06-13T22:07:51.860 に答える