Как я могу проверить в REPL, имеют ли два экземпляра одного и того же класса одинаковые атрибуты? - PullRequest
0 голосов
/ 07 июня 2018

Когда я пытаюсь изучить новую функцию или библиотеку, мне хотелось бы посмотреть, смогу ли я запустить какой-нибудь простой пример кода в среде REPL, например, блокнот Jupyter, чтобы проверить мое понимание.

Для этогоНапример, я хочу посмотреть, правильно ли я понимаю часть документации для модуля traitlets.В частности, я хотел бы иметь возможность запускать в блокноте 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>

Есть ли способ «de-traitletize» test1 и test2, чтобы яможно увидеть, различаются ли они «функционально / поведенчески» (то есть различаются ли их значения атрибутов), в отличие от двух разных экземпляров одного и того же класса, указывающих на два разных места в памяти?

Я думаюэтот вопрос может применяться более широко к тому, как проверить «поведенческое равенство» двух экземпляров любого класса в Python.Но если в модуле traitlets есть что-то конкретное, что позволяет ответить на этот вопрос в этом особом случае, но не в более общем смысле, это нормально.

1 Ответ

0 голосов
/ 07 июня 2018

Это был глупый вопрос, на который есть глупый ответ.Весь смысл traitlets в том, что «внешнему наблюдателю» атрибуты, являющиеся каким-то типом трейлета, кажутся «нормальными».Другими словами, они предназначены только для наблюдения «извне» , то есть через слой косвенности, обеспечиваемый определением класса, но не предназначены для проверки «напрямую».

Вот 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

Но если вы начнете делать (как я изначально делал с REPL в блокноте Juptyer):

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

и попытаетесь сделать что-то вроде:

test_list[0]

или

for fruit in test_list:
    print(fruit)

тогда возникает ошибка о том, что 'List' объекты не поддерживают индексацию или не повторяются.

Что я пытаюсь сказатьв том, что если кто-то хочет сделать маленькие глупые тесты, подобные этому, с traitlets на REPL (например, в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...