学完unittest之后,听说现在大家都用pytest....为了跟上潮流混口饭---开始学习pytest框架(微笑脸)
今天接触到的一个namedtuple工厂函数,学习记录以供后续复习
nametuple() 是具有命名字段的元组的工厂函数
命名元组为元组中每个位置赋予含义,并允许更具可读性的自编写代码
它们可以在任何使用常规元组的地方使用,并且他们添加了按名称而不是位置索引访问字段的功能。
用法:
collections.namedtuple(typename, field_names, *, verbose=False, rename=False, module=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__属性将设置为该值。
Python namedtuple(命名元组)使用实例
# task=namedtuple('task',['name','age','job','address'])
# task=namedtuple('task','name,age,job,address')
task=namedtuple('task','name age job address')
point=task("summary",18,"model","SZ")
print(point)
print(point.name)
for a in [point]:
print("%s is %d years old. She works in %s in %s." %a)
执行结果:
task(name='summary', age=18, job='IT', address='SZ')
summary
summary is 18 years old. She works in model in SZ.
来解释一下nametuple的几个参数,以task=namedtuple('task','name age job address')为例,其中’task’是这个namedtuple的名称,
后面的’name age job address’这个字符串中四个用空格隔开的字符告诉我们,我们的这个namedtuple有四个元素,分别名为name,age,job,和address。
我们在创建它的时候可以通过point=task(name='summary',age=18,job='model',address='SZ')这种方式,这类似于Python中类对象 的使用。而且,
我们也可以像访问类对象的属性那样使用Jane.name这种方式访问namedtuple的元素
使用.__new__.__defaults__创建默认的Task对象,不必指定所有属性
Task=namedtuple('Task','summary,owner,done,id') Task.__new__.__defaults__= (None,None,False,None) def test_defaults(): t1 = Task() t2=Task(None,None,False,None) assert t1==t2 print (t1,t2)
1,somenamedtuple._make(iterable)
从现有序列生成新实例或可迭代的类方法。
task=namedtuple('task','name age job address') point=task("summary",18,"model","SZ") t=[11,22,33,44] print(point._make(t))
执行结果:
------------------------
task(name=11, age=22, job=33, address=44)
2,somenamedtuple._asdict()
返回一个新的OrderedDict,它将字段名称映射到它们对应的值
print(point._asdict()) --- OrderedDict([('name', 'summary'), ('age', 18), ('job', 'model'), ('address', 'SZ')])
3,somenamedtuple._replace(**kwargs)
返回指定元组的新实例,用新值替换指定字段:
print(point._replace(name="lee")) -- task(name='lee', age=18, job='model', address='SZ')
4,namedtuple结合csv和sqlite用法
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') import csv for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): print(emp.name, emp.title) import sqlite3 conn = sqlite3.connect('/companydata') cursor = conn.cursor() cursor.execute('SELECT name, age, title, department, paygrade FROM employees') for emp in map(EmployeeRecord._make, cursor.fetchall()): print(emp.name, emp.title)