Пропали безрассудства для типа списка в attrs.asdict ()? - PullRequest
0 голосов
/ 23 января 2019

Я пытался создать вложенность класса list(), используя декоракторы Python attrs, и заметил, что attrs.asdict() не работает на некотором уровне переменных. Такие что:

  • attrs.asdict(mlle) отображается нормально
  • attrs.asdict(mlle.list_of_list_of_elements) # FAILS
  • attrs.asdict(mlle.list_of_list_of_elements[0]) отображается нормально

Мой рабочий пример:

import attr


@attr.s
class MyElement(object):
    element = attr.ib(default="mydefault", type=str)

@attr.s(slots=True)
class MyListOfElements(object):
    one_element = attr.ib(default=attr.Factory(MyElement))
    list_of_elements = attr.ib(default=attr.Factory(list), type=list)
    def add(self, le):
        self.list_of_elements.append(le)

@attr.s(slots=True)
class MyListOfList(object):
    version = attr.ib(default=None, type=str)
    list_of_list_of_elements = attr.ib(default=attr.Factory(list))  # Where's the dunder for this list?

e1 = MyElement("1.1.1.1")
e1_1 = MyElement("11.11.11.11")
le1 = MyListOfElements()
le1.add(e1)
le1.add(e1_1)
print("le1:", le1)

e2 = MyElement("2.2.2.2")
le2 = MyListOfElements(e2)
le2.list_of_elements.append(e2)
print("le2:", le2)

mlle = MyListOfList()
print("mlle:", mlle)
mlle.list_of_list_of_elements.append(le1)
mlle.list_of_list_of_elements.append(le2)
print("mlle:", mlle)

Теперь перейдем к использованию функции attr.asdict() ...

# attr.Dict
print("asdict(mlle):", attr.asdict(mlle))
print("asdict(mlle.lle):", attr.asdict(mlle.list_of_list_of_elements))  # FAILS
print("asdict(mlle.lle[0]):", attr.asdict(mlle.list_of_list_of_elements[0]))

Я совершенно уверен, что я сделал что-то простое неправильно, так как я думал, что ВСЕ вложенные переменные помечены attrs.

Я был более озадачен тем, что использование attr.asdict() не всегда доступно для каждой подточки с точками, так что mlle и mlle.list_of_list_of_elements[0] работают, но не mlle.list_of_list_of_elements между ними.

1 Ответ

0 голосов
/ 23 января 2019

attr.asdict берет экземпляр класса, декорированного attr.s.mlle и mlle.list_of_list_of_elements[0] являются экземплярами классов, декорированных attr.s.mlle.list_of_list_of_elements нет.

...