阅读Python 3.1中的更改,我发现了一些......意外的:
sys.version_info元组现在是一个命名元组:
我之前从未听说过命名元组,我认为元素可以用数字(如元组和列表)或键(如dicts)索引.我从没想过他们可以两种方式编入索引.
因此,我的问题是:
我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组.我的班级目前看起来像这样:
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),但它不是我的胃口.
所以确实存在着一个很好的技巧,它可以使我重新写成功无需添加大量的代码复杂度(元编程),或者我应该只吞下药丸,并与"查找和替换"继续前进?:)
我看到像这样的模式
def __init__(self, x, y, z):
...
self.x = x
self.y = y
self.z = z
...
Run Code Online (Sandbox Code Playgroud)
经常使用更多参数.有没有一种好方法可以避免这种乏味的重复性?该类应该继承namedtuple吗?
我在python中有一个名为tuple的类
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Run Code Online (Sandbox Code Playgroud)
我想做的是将其变成字典.我承认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)
必须可以腌制生成的对象.并且根据命名元组的特征,当表示时,输出的排序必须与构造对象时参数列表的顺序相匹配.
请考虑以下代码:
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
是否可以以简单的方式将文档字符串添加到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)
但这并没有削减它.是否有可能以其他方式做?
在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的"正确方法"是什么?
我想排序一个命名元组列表,而不必记住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本身不支持记录类型?这是一个有一个可变版本的namedtuple的问题.
我可以用namedtuple._replace.但我需要在集合中包含这些记录,并且由于namedtuple._replace创建了另一个实例,我还需要修改快速变得混乱的集合.
背景:我有一个设备,我需要通过TCP/IP轮询它获得的属性.即它的表示是一个可变对象.
编辑:我有一组我需要轮询的设备.
编辑:我需要使用PyQt遍历显示其属性的对象.我知道我可以添加像__getitem__和的特殊方法__iter__,但我想知道是否有更简单的方法.
编辑:我更喜欢一个属性固定的类型(就像它们在我的设备中一样),但是它是可变的.
namedtuple ×10
python ×10
tuples ×2
collections ×1
dictionary ×1
docstring ×1
field-names ×1
json ×1
mutable ×1
python-2.7 ×1
python-3.x ×1
python-attrs ×1
sorting ×1
type-hinting ×1