【问题标题】:Missing dunders for list type in attrs.asdict()?attrs.asdict() 中的列表类型缺少 dunders?
【发布时间】:2019-06-16 10:40:43
【问题描述】:

我试图使用 Python attrs 装饰器创建 list() 类的嵌套,并注意到 attrs.asdict() 在某些级别的子变量上不起作用。这样:

  • attrs.asdict(mlle) 显示正常
  • attrs.asdict(mlle.list_of_list_of_elements) # 失败
  • 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 无效。

【问题讨论】:

    标签: python python-attrs


    【解决方案1】:

    attr.asdict 采用 attr.s-decorated 类的实例。 mlle 和 mlle.list_of_list_of_elements[0] 都是 attr.s 装饰类的实例。 mlle.list_of_list_of_elements 不是。

    【讨论】:

    • 感谢您的简明解释;有什么方法可以继续以 Pythonise 方式在 list-type 上使用 attrs?
    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2021-07-29
    相关资源
    最近更新 更多