ホームページ >バックエンド開発 >Python チュートリアル >Python では「is」がメソッドの比較に失敗するのに、関数では機能するのはなぜですか?

Python では「is」がメソッドの比較に失敗するのに、関数では機能するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 18:35:03592ブラウズ

  Why Does `is` Fail to Compare Methods in Python, But Works for Functions?

Python におけるメソッドの等価性: 参照不等式の謎を解く

Python では、メソッドと関数には興味深い違いがあります。一方、関数は参照の等価性を示します。 、メソッドはそうではありません。これは、特にメソッドの比較に is 演算子に依存している場合に、予期しないバグにつながる可能性があります。

参照等価性がメソッドを排除する理由

静的エンティティである関数とは異なり、メソッドオブジェクトはアクセスされるたびに動的に作成されます。これは、メソッドが記述子として機能し、 .__get__ メソッドが呼び出されたときに新しいメソッド オブジェクトを返すためです。たとえば、以下の例では、

class What:
    def meth(self):
        pass

割り当て What.meth は関数オブジェクトを返します。これは、後で inst.meth が呼び出されたときに作成されるバインドされたメソッド オブジェクトとは異なります。これは、What.meth が False に評価される理由を説明しています。

Python 3.8 では等しい

Python バージョン 3.8 以降では、別のアプローチが利用可能です。等価性テストには == を使用します。 2 つのメソッドの .__self__ 属性と .__func__ 属性が同一のオブジェクトである場合、これらは同じ関数をラップし、同じインスタンスにバインドされていることを示します。

関数 __ および 非バインド メソッド

Python のバージョンに関係なく、関数と非バインド メソッド (Python 2 の場合) は、両方とも同じ基になる関数参照を表すため、is 演算子を使用して比較できます。

基になる関数のテスト

2 つのメソッドが同じ基になる関数を表すかどうかを確認することが要件の場合、.__func__ 属性を比較できます。

if What().meth.__func__ == What().meth.__func__:
    print("Methods represent the same function")
このアプローチでは、バインディング ステータスや Python バージョンに関係なく、メソッドと関数に対して一貫性のある信頼性の高い等価性チェックが提供されます。

以上がPython では「is」がメソッドの比較に失敗するのに、関数では機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。