当前位置: 首页 > 面试题库 >

Python无法将绑定方法与其自身进行比较

令狐献
2023-03-14
问题内容

我正在尝试编写一个测试,检查包含类的绑定方法的变量是否与对该方法的另一个引用相同。通常这不是问题,但是在同一类的另一个方法中完成时似乎不起作用。这是一个最小的示例:

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)

结果是,False即使我期望是这样True。该问题在Python 3.5和Python 2.7(在Anaconda下运行)中均得到体现。

我知道绑定方法是通过执行类似操作获得的闭包TestClass.test_method.__get__(instance, type(instance))。但是,我希望self.sample_method已经是对这种闭包的引用,因此self.sample_methodinstance.sample_method表示相同的引用。

让我感到困惑的部分原因是pytest我正在运行的真实测试的输出(在上为PR工作matplotlib):

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

如果我正确理解了输出,则实际比较(第一行)实际上是在比较相同的对象,但是不知何故出现了False。在这一点上,我唯一能想到的__get__就是实际上被两次调用,但是我既不知道为什么/在哪里/如何,也不知道如何解决它。


问题答案:

它们不是相同的引用-表示两种方法的对象在内存中的位置不同:

>>> class TestClass:
...     def sample_method(self):
...         pass
...     def test_method(self, method_reference):
...         print(hex(id(method_reference)))
...         print(hex(id(self.sample_method)))
... 
>>> instance = TestClass()
>>> instance.test_method(instance.sample_method)
0x7fed0cc561c8
0x7fed0cc4e688

更改为method_reference == self.sample_method将使断言通过。

自问题扩展以来的编辑:似乎是一个有缺陷的测试-
代码的实际功能可能不需要引用相同(is),而是相等(==)。因此,除了测试之外,您所做的更改可能不会破坏任何其他内容。



 类似资料:
  • 问题内容: 我有以下代码,并收到上述错误。由于我是python的新手,因此无法理解这里的语法以及如何解决错误: 问题答案: 有一种从日期时间转换为日期的方法。 要进行相反的转换,可以使用此功能

  • 本文向大家介绍详解python方法之绑定方法与非绑定方法,包括了详解python方法之绑定方法与非绑定方法的使用技巧和注意事项,需要的朋友参考一下 写在之前 在 Python 的类里面除了属性之外,还有方法,当然也有文档和注释这类东西,但是这个只是人来看,计算机则不关心。我们之前说过,我们一般用实例调用方法,既然我们说了是一般,那么就说明还有其他调用方法的方式,今天我们就来说一下「绑定方法和非绑定

  • 测试变量的常用方法是检查它是否引用singletone: 根据PEP-8,建议将此方法作为检查的唯一方法: 与None之类的单例进行比较时,应始终使用is或is,永远不要使用相等运算符。 虽然有时我发现以下测试在不同的来源: 这种方式看起来不错,但是我不太明白为什么简单易读的结构可以被所取代。它在某些情况下更有用,还是指代码风格? UPD:使用我发现非常有用(到目前为止):

  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • 问题内容: 这个问题已经在这里有了答案 : Python If == true语句仅在readline的最后一行有效 (1个答案) 2年前关闭。 我试图将我的一行与一个字符串进行比较,但是这行不通。我正在读取一个html文件,我需要解析该文件以将该部分发送到字典,但是当我使用if将行之一与字符串进行比较时,匹配时不会返回True。 这是代码: 问题答案: 我认为这是因为它尝试读取字符串中的换行符:

  • 本文向大家介绍Python中绑定与未绑定的类方法用法分析,包括了Python中绑定与未绑定的类方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中绑定与未绑定的类方法。分享给大家供大家参考,具体如下: 像函数一样,Python中的类方法也是一种对象。由于既可以通过实例也可以通过类来访问方法,所以在Python里有两种风格: 未绑定的类方法:没有self 通过类来引用方