我什么时候应该使用以及什么时候应该避免 Python 中的 namedtuple?

When should I use and when should I avoid namedtuple in Python?

在我在线 class 期间,我的一位 python 导师告诉我 namedtuple 弊大于利。

我很困惑为什么。有人可以指定何时使用 namedtuple 以及何时不使用吗?

我能看到的问题很少

您不能为 namedtuple 指定默认参数值 classes.This 当您的数据可能有许多可选属性时,它们会变得笨拙。

namedtuple 实例的属性值仍然可以使用数字索引和迭代访问。特别是在外部化的 API 中,这可能会导致无意的使用,从而更难转移到真实的 class later.If 您无法控制 namedtuple 实例的所有用法,它最好定义您自己的 class

以及何时使用它请查看 IMCoins

的评论

namedtuple 的 classic 示例是这样的...

>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(x=1, y=2)
>>> p.x
1
p.y
2

我认为大多数人一开始觉得有吸引力的是能够如此轻松地制作 class 并能够使用关键字参数 Point(x=1, y=2) 实例化并像 [=13= 这样进行点访问] 和 p.y

但是,有很多东西很容易被忽略,而且比较死板。 subclasses 也可能发生意想不到的事情。除非 namedtuple 真的符合您的用例,否则如果您只想要点名查找和漂亮的 repr,最好使用 SimpleNamespace

from types import SimpleNamespace

class Point(SimpleNameSpace):
    def __init__(self, x, y=0):
        # simple wrapper to accept arguments positionally or as keywords with defaults
        super().__init__(x=x, y=y)