Pythonデコレータは関数の引数を取りません

アーメド・M・アドリー

私はPythonを学んで
いて、デコレータが関数に機能を追加するということを理解している方法で立ち往生し
ています。数値が偶数かどうかをチェックする単純な関数を作成し、
次に絶対値を取ることを追加するデコレータを作成しました。

def decorate(func):
    def is_even_new(*args,**kwargs):
        num = abs(*args,**kwargs)
        func(num)
    return is_even_new()

@decorate 
def is_even(x):
    if x%2 == 0:
        return True
    else:
        return False

is_even(8)

しかし、TypeErrorが発生し続けます。abs()は引数を1つだけ取ります(0が指定さ
れています)。コードに問題があるのでしょうか、それともデコレータの理解が間違っているのでしょうか。

アナカンド

関数を装飾するときは、装飾された関数自体を返す必要があります。

def decorate(func):
    def is_even_new(*args,**kwargs):
        num = abs(*args,**kwargs)
        func(num)

    return is_even_new

装飾された関数を呼び出してそれを返すのではなく

def decorate(func):
    def is_even_new(*args,**kwargs):
        num = abs(*args,**kwargs)
        func(num)

    return is_even_new()

(余分な括弧に注意してください)。この最後の例では、関数を@decorateデコレートすると、デコレータはこの内部関数is_even_new定義し、後者を返す代わりに、引数なしでそれを呼び出そうとしますis_even_new()これは、TypeErrorabsexpects(正確に)1つの引数を取得している理由でもありますが、何も指定していません。

Pythonの関数は他の関数(「第一級市民」)と同じようにオブジェクトであるため、名前で直接参照できることを忘れないでください。

また、推奨事項として、で装飾された関数が@decorate(のようにis_even1つの引数しか受け取らないことがわかっている場合は、変数引数とキーワード引数を使用せず、1つのパラメーターも受け取るようにdecorate関数を定義してください。

import functools


def decorate(func):
    @functools.wraps(func)
    def decorated(x):
        func(abs(x))

    return decorated

これにより、エラーメッセージがより役立つようになります(abs電話で発生する代わりに

または、absたとえば最初の引数にのみ適用する場合は、次のようにします。

def decorate(func):
    @functools.wraps(func)
    def decorated(x, *args, **kwargs):
        func(abs(x), *args, **kwargs)

    return decorated

また、に気付くでしょう@functools.wrapsこれは、デコレータから返すようなラッパー関数を定義するための非常に便利な標準ライブラリユーティリティです。それはのような特殊な属性設定し__name____module__それは基本的に包まれた機能のように見えるようにラッパー関数に、など。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

タイマー関数は追加の引数を取りません

分類Dev

TensorFlow 2.0:@ tf.functionデコレータを使用した関数はnumpy関数を取りません

分類Dev

TypeError このコンストラクターは引数を取りません

分類Dev

関数呼び出しを取り除く方法は、Angular aotコンパイルのデコレータではサポートされていませんか?

分類Dev

可変個引数のテンプレート コンストラクターは x 引数を取りません

分類Dev

「AudioClip」は、0個の引数を取るコンストラクターを取りません

分類Dev

任意の数の関数を引数として受け取り、関数の合成を返すPythonデコレータ

分類Dev

C ++スレッドオーバーロードされた関数はX引数を取りません

分類Dev

デコレータ内で引数を取るPythonラッパー関数

分類Dev

main関数はhaskellで引数を取りません

分類Dev

Lambda関数は、位置順に引数を取りません

分類Dev

Scrapy-TypeError:このコンストラクターは引数を取りません

分類Dev

unittest- TypeError:このコンストラクターは引数を取りません

分類Dev

映画プロジェクトのPythonコードエラー「TypeError:このコンストラクターは引数を取りません」

分類Dev

エラーC2660:関数はX引数を取りません

分類Dev

Pythonは関数の引数を保持するデコレータを作成します

分類Dev

strtrok_s関数は2つの引数を取りません

分類Dev

「関数「instantiate」のオーバーロードは4つの引数を取りません」

分類Dev

PythonデコレータTypeErrorに1つの必須の位置引数がありません

分類Dev

エラーコード:C2661:オーバーロードされた関数は6つの引数を取りません

分類Dev

Python3は@propertyをデコレータ引数として渡すことができません

分類Dev

オーバーロードされた関数は2つの引数(ファンクター)を取りません

分類Dev

C ++関数の引数のデータ型には名前がありません

分類Dev

Pythonインタープリターエラー、xは引数を取りません(1つ指定)

分類Dev

C ++には引数の可変個引数テンプレート関数はありません

分類Dev

'TypeErrorを修正する方法:タイプ'関数 'の引数はPythonで反復可能ではありません'

分類Dev

独自のデータを使用してmutate_at関数とmax()関数を使用してRでコードを試しました。警告メッセージが表示されます:maxへの欠落していない引数はありません

分類Dev

Pythonの引数付きデコレータ関数

分類Dev

パンダの関数describe()は私のコードでは機能しません、csvはデータフレームではありませんか?

Related 関連記事

  1. 1

    タイマー関数は追加の引数を取りません

  2. 2

    TensorFlow 2.0:@ tf.functionデコレータを使用した関数はnumpy関数を取りません

  3. 3

    TypeError このコンストラクターは引数を取りません

  4. 4

    関数呼び出しを取り除く方法は、Angular aotコンパイルのデコレータではサポートされていませんか?

  5. 5

    可変個引数のテンプレート コンストラクターは x 引数を取りません

  6. 6

    「AudioClip」は、0個の引数を取るコンストラクターを取りません

  7. 7

    任意の数の関数を引数として受け取り、関数の合成を返すPythonデコレータ

  8. 8

    C ++スレッドオーバーロードされた関数はX引数を取りません

  9. 9

    デコレータ内で引数を取るPythonラッパー関数

  10. 10

    main関数はhaskellで引数を取りません

  11. 11

    Lambda関数は、位置順に引数を取りません

  12. 12

    Scrapy-TypeError:このコンストラクターは引数を取りません

  13. 13

    unittest- TypeError:このコンストラクターは引数を取りません

  14. 14

    映画プロジェクトのPythonコードエラー「TypeError:このコンストラクターは引数を取りません」

  15. 15

    エラーC2660:関数はX引数を取りません

  16. 16

    Pythonは関数の引数を保持するデコレータを作成します

  17. 17

    strtrok_s関数は2つの引数を取りません

  18. 18

    「関数「instantiate」のオーバーロードは4つの引数を取りません」

  19. 19

    PythonデコレータTypeErrorに1つの必須の位置引数がありません

  20. 20

    エラーコード:C2661:オーバーロードされた関数は6つの引数を取りません

  21. 21

    Python3は@propertyをデコレータ引数として渡すことができません

  22. 22

    オーバーロードされた関数は2つの引数(ファンクター)を取りません

  23. 23

    C ++関数の引数のデータ型には名前がありません

  24. 24

    Pythonインタープリターエラー、xは引数を取りません(1つ指定)

  25. 25

    C ++には引数の可変個引数テンプレート関数はありません

  26. 26

    'TypeErrorを修正する方法:タイプ'関数 'の引数はPythonで反復可能ではありません'

  27. 27

    独自のデータを使用してmutate_at関数とmax()関数を使用してRでコードを試しました。警告メッセージが表示されます:maxへの欠落していない引数はありません

  28. 28

    Pythonの引数付きデコレータ関数

  29. 29

    パンダの関数describe()は私のコードでは機能しません、csvはデータフレームではありませんか?

ホットタグ

アーカイブ