2017-12-23 24 views
0

私はを使用しています。PyCharm IDE以下はデコレータを使用しているコードの断片です。デコレータは、基本的に引数extractが整数> = 0であるかどうかをチェックしています。 このコードは私が知る限りでは動作しますが、PyCharmでは構文エラーがあることに気付きました。Pycharmのクラススロー警告内のデコレータ

class MyClass(object):  
    def _argument_test_extract(func): 
     def _helper(*args, **kwargs): 
      kwargs = inspect.getcallargs(func, *args, **kwargs) 
      if 'rule' in kwargs: 
       extract = kwargs['rule']['extract'] 
       if type(extract) == int and extract >= 0: 
        return func(**kwargs) 
       else: 
        raise Exception("Argument `extract` is not an integer") 
     return _helper 

    @_argument_test_extract 
    def _perform_split_model_string(self, rule): 
     # do some stuff 

PyCharm私は@_argument_test_extractと機能を飾るラインの次のメッセージを示す:

関数 '_argument_test_extract' が位置引数

ライン欠いデコレータ関数が定義されていますdef _argument_test_extract(func):は次のメッセージを示します

通常の関数の最初のパラメータは最後の行return func(**kwargs)次のメッセージを示す '自己'

です:

は 'MyClassの'

呼び出すことはできません

明らかに、_argument_test_extract@staticmethodに飾ると、PyCharmの警告はすべて消えますが、このエラーのためにコードはもう機能しません。TypeError: 'staticmethod' object is not callable

私の構文に何か問題がありますか?おかげ

+2

デコレータがクラス内にあるのはなぜですか?標準機能として外部に移動するだけです。 – jonrsharpe

答えて

1

はよく

私の構文に何か問題があります...それが動作するかどうか、明らかではない:-)。 pycharmの静的解析に問題がある可能性があります。

と言えば、と書いてありますが、です。 PyCharmがそれを気付いて(クラス作成後)、_argument_test_abstractがクラスのメソッドになる予定です。クラスのメソッドとして、_argument_test_abstractには引数が必要です。しかし、クラス作成時に_argument_test_abstractはまだ方法ではなく、これが装飾が行われるときです。 (@staticmethodは、staticmethod記述子自体が呼び出すことができないため、__get__から返される関数のみ)問題を解決しません。

だから、どこから私たちが離れるのでしょうか?あなたは自分の持っているものを使い続け、pycharmを無視することもできますし、クラスからデコレータを移動してモジュールレベルにすることもできます。それは本当に最初のクラスでクラスに入る必要はありません:-)。私はあなたのコードを読んでいる人の多くがselfがどこにあるのだろうと思っているし、あなたがそれを実行しようとするたびにこの全部が爆破しないのはどういうことかと思いますので、

+0

ありがとう、これは素晴らしい説明です、私はクラスからデコレータを移動します。 – Michael

+0

私はPyCharmがそのようなオプションをより明確に示唆したいと思っています。 – Michael