类似于namedlist,但具有其他特性(嵌套类、递归合并等)。
mutabletuple的Python项目详细描述
概述
类似于namedlist,但具有其他功能: *像本地python字典一样打印 *改进对嵌套可变元组的支持 *递归地完成到字典的转换 *可以使用类似词典的iteritems进行迭代 *从dict或其他可变元组合并嵌套可变元组 *mtfactory支持参数 *嵌套pickle支持
warningpickling有效,但仅适用于具有默认值的可变元组。
典型用法
您可以使用可变元组,如可变名称元组:
>>> from mutabletuple import mutabletuple >>> from collections import OrderedDict >>> Point = mutabletuple('Point', 'x y') >>> p = Point(1, 3) >>> p.x = 2 >>> assert p.x == 2 >>> assert p.y == 3
或者,可以为所有字段指定默认值:
>>> Point = mutabletuple('Point', ['x', 'y'], default=3) >>> p = Point(y=2) >>> assert p.x == 3 >>> assert p.y == 2
或者,可以指定每个字段的默认值:
>>> Point = mutabletuple('Point', [('x', 0), ('y', 100)]) >>> p = Point() >>> assert p.x == 0 >>> assert p.y == 100
如果使用映射,则可以方便地指定mtnodefault值 字段使用默认值:
>>> from mutabletuple import MtNoDefault >>> Point = mutabletuple('Point', OrderedDict((('y', MtNoDefault), ... ('x', 100))), ... default=5) >>> p = Point() >>> assert p.x == 100 >>> assert p.y == 5
名称列表式行为
可变元组的行为类似于namedlist。查看namedlist的文档了解更多详细信息:https://pypi.python.org/pypi/namedlist
附加功能
其他班级成员
可变元组类包含以下成员:
- asdict():返回一个dict,它将字段名映射到 相应的值。
- 字段:列出字段名的字符串元组。有助于反省。
- 合并:递归地与dict或另一个可变元组合并。
- ordered dict:递归地将可变元组转换为有序dict。
- iteritems:像dict一样迭代。
可变默认值
对于可变元组,请注意指定可变默认值 价值观。由于python处理默认值的方式,每个 可变元组将共享默认值。这尤其有问题 默认值为列表。例如:
>>> A = mutabletuple('A', [('x', [])]) >>> a = A() >>> a.x.append(4) >>> b = A() >>> assert b.x == [4]
这可能不是所需的行为,请参阅下一节。
为默认值指定工厂函数
对于可变元组,可以为 默认情况下,通过在mtfactory调用中包装它。唯一的变化 例如,将默认值从[]更改为mtfactory(list)。但是 注意b.x是一个新的列表对象,不与a.x共享:
>>> from mutabletuple import MtFactory >>> A = mutabletuple('A', [('x', MtFactory(list))]) >>> a = A() >>> a.x.append(4) >>> b = A() >>> assert b.x == []
每次创建新实例时,您的可调用(在本例中, list),将被调用以生成默认值的新实例 价值。
为工厂函数指定参数
当使用嵌套的可变元组时,可能需要提供参数 用于创建嵌套的可变元组。下面是一个例子 操作方法:
>>> Point = mutabletuple('Point', [('x', 0), ('y', 0)]) >>> Vector = mutabletuple('Vector', [('p1', MtFactory(Point, 2)), ... ('p2', MtFactory(Point, 4, 8))]) >>> v1 = Vector() >>> assert(v1 == Vector(Point(2, 0), Point(4, 8)))
每次创建向量时都会创建初始化点。
将可变元组与可变元组或dict合并
当使用嵌套的可变元组时,可以使用 递归地与只表示子集的字典合并 可变元组的数目:
>>> Point = mutabletuple('Point', [('x', 0), ('y', 0)]) >>> Vector = mutabletuple('Vector', [('p1', MtFactory(Point)), ... ('p2', MtFactory(Point))]) >>> Shape = mutabletuple('Shape', [('v1', MtFactory(Vector)), ... ('v2', MtFactory(Vector))]) >>> s = Shape() >>> d = {'v1': {'p1': {'x': 20}, 'p2': Point(30, 40)}} >>> s.merge(d) >>> assert(s._asdict() == { ... 'v1': {'p1': {'x': 20, 'y': 0}, 'p2': {'x': 30, 'y': 40}}, ... 'v2': {'p1': {'x': 0, 'y': 0}, 'p2': {'x': 0, 'y': 0}}})
迭代实例
因为实例是可iterable的(如列表或元组),所以迭代可以工作 同样的方式。值按定义顺序返回:
>>> Point = mutabletuple('Point', 'x y z t') >>> p = Point(1.0, 42.0, 3.14, 2.71828) >>> for value in p: ... print(value) 1.0 42.0 3.14 2.71828
创建和使用实例
因为mutabletuple返回的类型是 python类,可以像创建任何python类一样创建实例。
更改日志
0.1 2015-03-21尼古拉斯•贝苏
- 初次发布。
- 为namedlist带来一些额外的特性,以便支持类的嵌套可变元组和递归合并。