python namedtuple的使用
在看pytest测试实战一书中,看到了python namedtuple这个模块,在网上查询了一下还挺好用的,记录下来: 摘自https://www.jianshu.com/p/60e6484a7088 首先,我会介绍下使用 基本概念
如何使用
参数解析def namedtuple(typename,field_names,*,rename=False,defaults=None,module=None):
有两个必填参数
基本使用理解了 >>> Point = namedtuple(‘Point‘,[‘x‘,‘y‘]) # 返回一个名为`Point`的类,并赋值给名为`Point`的变量 >>> p = Point(11,y=22) # 可以根据参数的位置,或具名参数来实例化(像普通的类一样) >>> p[0] + p[1] # 具名元组可以像普通元组一样通过`index`访问 33 >>> x,y = p # 具名元组可以像普通元组一样解包 >>> x,y (11,22) >>> p.x + p.y # 具名元组还可以通过属性名称访问元组内容 33 >>> p # 具名元组在调用`__repr__`,打印实例时,更具可读性 Point(x=11,y=22)
具名元组在存储 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,paygrade FROM employees‘) for emp in map(EmployeeRecord._make,cursor.fetchall()): print(emp.name,emp.title)
特性具名元组除了拥有继承自基本元组的所有方法之外,还提供了额外的三个方法和两个属性,为了防止命名冲突,这些方法都会以下划线开头
>>> t = [11,22] >>> Point._make(t) Point(x=11,y=22)
>>> p = Point(x=11,y=22) >>> p._asdict() OrderedDict([(‘x‘,11),(‘y‘,22)])
>>> p = Point(x=11,y=22) >>> p._replace(x=33) Point(x=33,y=22) >>> for partnum,record in inventory.items(): ... inventory[partnum] = record._replace(price=newprices[partnum],timestamp=time.now())
>>> p._fields # view the field names (‘x‘,‘y‘) >>> Color = namedtuple(‘Color‘,‘red green blue‘) >>> Pixel = namedtuple(‘Pixel‘,Point._fields + Color._fields) >>> Pixel(11,22,128,255,0) Pixel(x=11,y=22,red=128,green=255,blue=0)
>>> Account = namedtuple(‘Account‘,[‘type‘,‘balance‘],defaults=[0]) >>> Account._fields_defaults {‘balance‘: 0} >>> Account(‘premium‘) Account(type=‘premium‘,balance=0)
使用技巧
>>> getattr(p,‘x‘) 11
>>> d = {‘x‘: 11,‘y‘: 22} >>> Point(**d) Point(x=11,y=22)
>>> class Point(namedtuple(‘Point‘,‘y‘])): ... __slots__ = () ... @property ... def hypot(self): ... return (self.x ** 2 + self.y ** 2) ** 0.5 ... def __str__(self): ... return ‘Point: x=%6.3f y=%6.3f hypot=%6.3f‘ % (self.x,self.y,self.hypot) >>> for p in Point(3,4),Point(14,5/7): ... print(p) Point: x= 3.000 y= 4.000 hypot= 5.000 Point: x=14.000 y= 0.714 hypot=14.018
namedtuple纸牌import collections
# 将纸牌定义为具名元组,每个纸牌都有等级和花色 Card = collections.namedtuple(‘Card‘,‘rank suit‘) class FrenchDeck: # 等级2-A ranks = [str(n) for n in range(2,11)] + list(‘JQKA‘) # 花色红黑方草 suits = ‘spades diamonds clubs hearts‘.split() # 构建纸牌 def __init__(self): self._cards = [Card(rank,suit) for suit in self.suits for rank in self.ranks] # 获取纸牌 def __getitem__(self,position): return self._cards[position] >>> french_deck = FrenchDeck() >>> french_deck[0] Card(rank=‘2‘,suit=‘spades‘) >>> french_deck[0].rank ‘2‘ >>> french_deck[0].suit ‘spades‘
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |