クラスのバインドされたメソッドを保持する変数がそのメソッドの別のリファレンスと同じかどうかをチェックするテストを作成しようとしています。通常これは問題ではありませんが、同じクラスの別のメソッド内で実行された場合は動作しません。ここでは、最小限の例です:Pythonがバインドされたメソッドを自分自身と比較できない
class TestClass:
def sample_method(self):
pass
def test_method(self, method_reference):
print(method_reference is self.sample_method)
私は本当にassert
代わりのprint
を使用していますが、最終結果は同じであるので、それはどちらもここにもあります。次のようにテストが実行されます。
instance = TestClass()
instance.test_method(instance.sample_method)
結果は、私はそれがTrue
であることを期待していていてもFalse
です。この問題はPython 3.5とPython 2.7(Anacondaの下で動作しています)の両方で現れます。
バインドされたメソッドは、TestClass.test_method.__get__(instance, type(instance))
のようなものを実行することによって取得されるクロージャです。しかし、私はself.sample_method
がすでにそのようなクロージャへの参照であると期待しているので、self.sample_method
とinstance.sample_method
は同じ参照を表します。私が正しく出力を理解していれば、実際の比較(、
assert <bound method TestTransformFormatter.transform1 of <matplotlib.tests.test_ticker.TestTransformFormatter object at 0x7f0101077b70>> is <bound method TestTransformFormatter.transform1 of <matplotlib.tests.test_ticker.TestTransformFormatter object at 0x7f0101077b70>>
E + where <bound method TestTransformFormatter.transform1 of <matplotlib.tests.test_ticker.TestTransformFormatter object at 0x7f0101077b70>> = <matplotlib.ticker.TransformFormatter object at 0x7f0101077e10>.transform
E + and <bound method TestTransformFormatter.transform1 of <matplotlib.tests.test_ticker.TestTransformFormatter object at 0x7f0101077b70>> = <matplotlib.tests.test_ticker.TestTransformFormatter object at 0x7f0101077b70>.transform1
:ここで私を混乱されているものの
パートは私が実行している本当のpytest
テスト(matplotlib
ためのPRに取り組んで)の出力であります最初の行)は実際に同じオブジェクトを比較していますが、何とかしてFalse
になります。この時点で私が想像できる唯一のことは、実際には__get__
が2回呼び出されているということですが、理由/方法/方法もわからず、回避する方法もわかりません。
これは完全に予想されます。すべての 'instance.sample_method'が同じオブジェクトであるわけではありません。すべての' 5024 'が同じオブジェクトであるわけではありません。 – user2357112
@ user2357112それは意味をなさない。ここで私がうまくいけば明らかになった私の質問は、実際に異なるオブジェクトがどこに作られているのでしょうか? –
'instance.sample_method'に対して1回、' test_method'内で 'self.sample_method'に対して1回です。 – user2357112