python 高级进阶之命名元组

元组元素的命名

对于一个元组如:

>>> s = ('Jack', 21, 'male', '5788666@qq.com')

要得到该对象的名字,年龄,性别及邮箱的方法为:s[0],s[1],s[2],s[3]。那么如果程序中充斥了大量的这种没有意义的索引数字,则会影响代码的可读性。所以考虑以下方法来解决这个问题:

  • 方法一:
>>> NAME = 0
>>> AGE = 1
>>> SEX = 2
>>> EMAIL = 3
# 或者通过这样定义
>>> NAME, AGE, SEX, EMAIL = xrange(4)

则此时就可以通过s[NAME],s[AGE],s[SEX],s[EMAIL]这种见名知意的方式来获取所需值。

  • 方法二:
    命名元组(利用 collections 模块中的 namedtuple 函数)
>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
>>> s = Student('Jim', 21, 'male', '123@qq.com')
>>> s.name
'Jim'
>>> s.age
21

namedtuple 函数这里接收两个参数,第一个参数为要创建类型的名称,第二个参数是一个列表,代表了每一个索引的名字。当建立完这个 Student 类之后,就可以使用正常的构造方法来构造新的对象如 s,并且可以直接通过访问属性的方式来访问所需要的值。
此时使用isinstance函数对比内置的tuple

>>> isinstance(s, tuple)
True

可见用namedtuple构造出来的类其本质就是一个tuple元组,所以仍然可以使用下标的方式来访问属性。并且在任何要求类型为元组的地方都可以使用这个namedtuple
参考文档:

namedtuple(typename, field_names, verbose=False, rename=False)
    Returns a new subclass of tuple with named fields.

    >>> Point = namedtuple('Point', ['x', 'y'])
    >>> Point.__doc__                   # docstring for the new class
    'Point(x, y)'
    >>> p = Point(11, y=22)             # instantiate with positional args or keywords
    >>> p[0] + p[1]                     # indexable like a plain tuple
    33
    >>> x, y = p                        # unpack like a regular tuple
    >>> x, y
    (11, 22)
    >>> p.x + p.y                       # fields also accessable by name
    33
    >>> d = p._asdict()                 # convert to a dictionary
    >>> d['x']
    11
    >>> Point(**d)                      # convert from a dictionary
    Point(x=11, y=22)
    >>> p._replace(x=100)               # _replace() is like str.replace() but targets named fields
    Point(x=100, y=22)

推荐阅读更多精彩内容