nametuple() 是具有命名字段的元组的工厂函数


命名元组为元组中每个位置赋予含义,并允许更具可读性的自编写代码 

它们可以在任何使用常规元组的地方使用,并且他们添加了按名称而不是位置索引访问字段的功能。


用法:

collections.namedtuple(typenamefield_names*verbose=Falserename=Falsemodule=None)


    返回名为typename的新元组子类。 新的子类用于创建类似元组的对象,这些对象具有可以通过属性查找访问的字段以及可索引和可迭代的字段。 子类的实例也有一个有用的docstring(带有typename和field_names)和一个有用的__repr __()方法,它以name = value格式列出元组内容。


    field_names是单个字符串,每个字段名由"空格"和"/"或"逗号"分隔,例如'x y'或'x,y'。或者,field_names 可以是一系列字符串,例如['x', 'y']。


    任何有效的Python标识符都可以用于字段名称,除了以下划线开头的名称外。 

    有效标识符由字母,数字和下划线组成,但不以数字或下划线开头,并且不能是关键字,例如:class,for,return,global,pass或raise。


    如果 rename 为true,则无效的字段名会自动替换为位置名称。 

    例如,将['abc','def','ghi','abc']转换为['abc','_1','ghi','_3'],从而消除关键字def和重复字段名abc。


    如果verbose为true,则在构建类定义之后打印它。 此选项已过时; 相反,打印_source属性更简单。

    如果定义了module,则将命名元组的__module__属性将设置为该值。


命名的元组实例没有每个实例的字典,因此它们是轻量级的,并且不需要比常规元组占用更多的内存。

在版本3.1中更改:添加了对rename的支持。

在版本3.6中更改:verbose 和 rename 参数成为 keyword-only 参数。

在版本3.6中更改:添加了module参数。

2 . python Collections -- Namedtuple()_第1张图片


命名元组对于将字段名称分配给由csv或sqlite3模块返回的结果元组特别有用:

2 . python Collections -- Namedtuple()_第2张图片

        除了从元组继承的方法外,命名元组还支持三个额外的方法和两个属性。为防止与字段名称冲突,方法和属性名称以下划线开头。


(1)classmethod 

    somenamedtuple._make(iterable)

                从现有序列生成新实例或可迭代的类方法。

            image.png

            

    somenamedtuple._asdict()

                返回一个新的OrderedDict,它将字段名称映射到它们对应的值:

            image.png


            somenamedtuple._replace(**kwargs)

                返回指定元组的新实例,用新值替换指定字段:

             2 . python Collections -- Namedtuple()_第3张图片


    somenamedtuple._source

                带有纯Python源代码的字符串,用于创建命名元组类。 源使得命名元组自我记录。 它可以打印,使用exec()执行,或保存到文件并导入。


                

    somenamedtuple._fields

                列出字段名称的字符串元组。 用于内省和从现有命名元组中创建新的命名元组类型。

            2 . python Collections -- Namedtuple()_第4张图片

            

            要检索名称存储在字符串中的字段,请使用getattr( )函数:

            image.png

    

            要将字典转换为命名元组,请使用double-star-operator(双星运算符)(如解包参数列表中所述):

            image.png


              由于命名元组是常规的Python类,因此可以使用子类轻松添加或更改功能。以下是如何添加计算字段固定宽度打印格式的方法:

              2 . python Collections -- Namedtuple()_第5张图片


               

                上面显示的子类将__slots__设置为一个空元组。 这有助于防止创建实例字典,从而降低内存需求。

                子类化对于添加新的存储字段没有用处。 

                相反,只需从_fields属性创建一个新的命名元组类型:

                image.png

   

                可以通过直接分配__doc__字段来自定义文档字符串:

                image.png

                

                可以使用_replace()来自定义原型实例来实现默认值:

                image.png