当我尝试学习新的函数或库时,我想看看我是否可以在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; test1
和test2
所以我可以看到他们是否在功能/行为方面&#34;不同(即它们的属性值是不同的),而不是仅仅是指向内存中两个不同位置的同一类的两个不同实例?
我认为这个问题可能更普遍适用于如何测试&#34;行为平等&#34; Python中任何类的两个实例。但是,如果traitlets
模块中有某些特定内容允许在这个特殊情况下回答这个问题,但不是更普遍,这很好。
答案 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