标签: namedtuple

什么是Python中的"命名元组"?

阅读Python 3.1中更改,我发现了一些......意外的:

sys.version_info元组现在是一个命名元组:

我之前从未听说过命名元组,我认为元素可以用数字(如元组和列表)或键(如dicts)索引.我从没想过他们可以两种方式编入索引.

因此,我的问题是:

  • 什么叫元组?
  • 怎么用?
  • 为什么/何时应该使用命名元组而不是普通元组?
  • 为什么/何时应该使用普通元组而不是命名元组?
  • 是否有任何类型的"命名列表"(命名元组的可变版本)?

python tuples namedtuple

843
推荐指数
9
解决办法
32万
查看次数

namedtuple和可选关键字参数的默认值

我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组.我的班级目前看起来像这样:

class Node(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

转换为namedtuple它后看起来像:

from collections import namedtuple
Node = namedtuple('Node', 'val left right')
Run Code Online (Sandbox Code Playgroud)

但这里有一个问题.我的原始类允许我传入一个值,并使用命名/关键字参数的默认值来处理默认值.就像是:

class BinaryTree(object):
    def __init__(self, val):
        self.root = Node(val)
Run Code Online (Sandbox Code Playgroud)

但是这对我重构的名为元组的情况不起作用,因为它希望我传递所有字段.当然,我可以代替的出现Node(val)Node(val, None, None),但它不是我的胃口.

所以确实存在着一个很好的技巧,它可以使我重新写成功无需添加大量的代码复杂度(元编程),或者我应该只吞下药丸,并与"查找和替换"继续前进?:)

python default-value optional-arguments namedtuple

265
推荐指数
11
解决办法
9万
查看次数

如何避免__init__中的"self.x = x; self.y = y; self.z = z"模式?

我看到像这样的模式

def __init__(self, x, y, z):
    ...
    self.x = x
    self.y = y
    self.z = z
    ...
Run Code Online (Sandbox Code Playgroud)

经常使用更多参数.有没有一种好方法可以避免这种乏味的重复性?该类应该继承namedtuple吗?

python namedtuple python-2.7 python-decorators python-attrs

169
推荐指数
10
解决办法
1万
查看次数

python命名为字典的元组

我在python中有一个名为tuple的类

class Town(collections.namedtuple('Town', [
    'name', 
    'population',
    'coordinates',
    'population', 
    'capital', 
    'state_bird'])):
    # ...
Run Code Online (Sandbox Code Playgroud)

我想做的是将其变成字典.我承认python不是我强大的语言之一.关键是我不希望它与我所拥有的字段的名称或数字紧密相关.

有没有办法写它,以便我可以添加更多的字段,或传递一个完全不同的命名元组并获取字典.

编辑:我不能改变原来的类定义,因为它在别人的代码中.所以我需要一个城镇的实例并将其转换为字典.

python dictionary tuples namedtuple

126
推荐指数
3
解决办法
6万
查看次数

在Python中是否存在可变的命名元组?

任何人都可以修改namedtuple或提供替代类,以便它适用于可变对象吗?

主要是为了可读性,我想要类似于namedtuple这样做:

from Camelot import namedgroup

Point = namedgroup('Point', ['x', 'y'])
p = Point(0, 0)
p.x = 10

>>> p
Point(x=10, y=0)

>>> p.x *= 10
Point(x=100, y=0)
Run Code Online (Sandbox Code Playgroud)

必须可以腌制生成的对象.并且根据命名元组的特征,当表示时,输出的排序必须与构造对象时参数列表的顺序相匹配.

python mutable namedtuple

105
推荐指数
6
解决办法
3万
查看次数

在namedtuple中输入提示

请考虑以下代码:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))
Run Code Online (Sandbox Code Playgroud)

上面的代码只是一种证明我想要实现的目标的方法.我想namedtuple用类型提示.

你知道如何达到预期效果的优雅方式吗?

python type-hinting namedtuple python-3.x python-dataclasses

100
推荐指数
3
解决办法
2万
查看次数

将docstrings添加到namedtuples?

是否可以以简单的方式将文档字符串添加到namedtuple?

我试过了

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
"""
A point in 2D space
"""

# Yet another test

"""
A(nother) point in 2D space
"""
Point2 = namedtuple("Point2", ["x", "y"])

print Point.__doc__ # -> "Point(x, y)"
print Point2.__doc__ # -> "Point2(x, y)"
Run Code Online (Sandbox Code Playgroud)

但这并没有削减它.是否有可能以其他方式做?

python docstring namedtuple

76
推荐指数
6
解决办法
1万
查看次数

将Python namedtuple序列化为json

namedtuple保留字段名称的情况下序列化到json 的推荐方法是什么?

将a namedtuple序列化为json只会导致序列化的值和字段名称在翻译中丢失.我想在json化时保留字段,因此做了以下事情:

class foobar(namedtuple('f', 'foo, bar')):
    __slots__ = ()
    def __iter__(self):
        yield self._asdict()
Run Code Online (Sandbox Code Playgroud)

上面按照我的预期序列化到json,并且namedtuple在我使用的其他地方行为(属性访问等),除了在迭代它时使用非元组结果(这对我的用例来说很好).

在保留字段名称的情况下转换为json的"正确方法"是什么?

python json namedtuple

69
推荐指数
6
解决办法
3万
查看次数

Pythonic方法按字段名称排序namedtuples列表

我想排序一个命名元组列表,而不必记住fieldname的索引.我的解决方案似乎相当尴尬,并希望有人会有一个更优雅的解决方案.

from operator import itemgetter
from collections import namedtuple

Person = namedtuple('Person', 'name age score')
seq = [
    Person(name='nick', age=23, score=100),
    Person(name='bob', age=25, score=200),
]

# sort list by name
print(sorted(seq, key=itemgetter(Person._fields.index('name'))))
# sort list by age
print(sorted(seq, key=itemgetter(Person._fields.index('age'))))
Run Code Online (Sandbox Code Playgroud)

谢谢,尼克

python sorting field-names namedtuple

50
推荐指数
3
解决办法
2万
查看次数

为什么Python不支持记录类型?(即可变的namedtuple)

为什么Python本身不支持记录类型?这是一个有一个可变版本的namedtuple的问题.

我可以用namedtuple._replace.但我需要在集合中包含这些记录,并且由于namedtuple._replace创建了另一个实例,我还需要修改快速变得混乱的集合.

背景:我有一个设备,我需要通过TCP/IP轮询它获得的属性.即它的表示是一个可变对象.

编辑:我有一组我需要轮询的设备.

编辑:我需要使用PyQt遍历显示其属性的对象.我知道我可以添加像__getitem__和的特殊方法__iter__,但我想知道是否有更简单的方法.

编辑:我更喜欢一个属性固定的类型(就像它们在我的设备中一样),但是它是可变的.

python collections namedtuple

48
推荐指数
5
解决办法
3万
查看次数