如何在REPL中测试同一个类的两个实例是否具有相同的属性?

时间:2018-06-07 00:03:31

标签: python jupyter-notebook

当我尝试学习新的函数或库时,我想看看我是否可以在REPL环境中运行一些简单的示例代码,比如Jupyter笔记本,以测试我的理解。

对于此示例,我想看看我是否正确了解traitlets模块的part of the documentation。具体来说,我希望能够在Jupyter笔记本中运行类似:

from traitlets import List, Unicode
test1 = List(Unicode())
test2 = List(trait=Unicode())
test1 == test2

并且结果是"有意义的"。以上运行,并返回False,但我不确定结果实际上是否有意义",因为看起来这只是因为这两个对象指向不同的地址记忆,不是因为它们实际上是List具有不同的值。例如,人们会在REPL中看到类似的东西:

 test1
 <traitlets.traitlets.List at 0x111a04748>

test2
<traitlets.traitlets.List at 0x111a046a0>

有没有办法去#tra; de-traitletize&#34; test1test2所以我可以看到他们是否在功能/行为方面&#34;不同(即它们的属性值是不同的),而不是仅仅是指向内存中两个不同位置的同一类的两个不同实例?

我认为这个问题可能更普遍适用于如何测试&#34;行为平等&#34; Python中任何类的两个实例。但是,如果traitlets模块中有某些特定内容允许在这个特殊情况下回答这个问题,但不是更普遍,这很好。

1 个答案:

答案 0 :(得分:0)

这是一个愚蠢的问题,有一个愚蠢的答案。 traitlets的重点在于,对于外部观察者&#34;,属于某种类型的traitlet的属性似乎是&#34; normal&#34;。换句话说,它们只是被观察到&#34;外部&#34; ,即通过类定义提供的间接层,但不打算进行检查&#34;直接&#34;

这是我的意思的MWE:

import traitlets

class Fruits(traitlets.HasTraits):
    test_list = traitlets.List(trait=traitlets.Unicode(), default_value=['apple', 'orange'])

    def choose_fruit(self):
        fruit = self.test_list[0]
        return fruit

salad = Fruits()

salad.test_list()

['apple', 'orange']

salad.choose_fruit()

'apple'

for fruit in salad.test_list:
    print(fruit)

apple
orange

但如果一个人开始做(就像我最初使用Juptyer笔记本中的REPL一样):

import traitlets
test_list = traitlets.List(trait=traitlets.Unicode(), default_value=['apple', 'orange'])

并尝试做以下事情:

test_list[0]

for fruit in test_list:
    print(fruit)

然后我会得到关于'List'对象如何不支持索引或不可迭代的错误。

我想说的是,如果想在REPL上使用traitlets进行这样的愚蠢小测试(例如在Jupyter Notebook中),那么首先需要通过定义引入一层间接首先是这些特征是属性的类(它们不能直接检查)。

使用与问题中相同的MWE,必须执行以下操作:

import traitlets

class Test1(traitlets.HasTraits):
     list = traitlets.List(traitlets.Unicode())

class Test2(traitlets.HasTraits):
     list = traitlets.List(trait=traitlets.Unicode())

test1 = Test1()
test2 = Test2()

test1.list == test2.list