【python】asq模块-selector

上官季
2023-12-01

原文连接:http://docs.asq.googlecode.com/hg/1.0/html/reference/selectors.html#selectors

(首次翻译,水平不咋地,见笑见笑)

译文:

asq.selectors(选择器)

关于selector函数.

之所以叫选择器,是因为它们用于从一个元素中选取某个值. 被选取的值通常是一个属性或子元素,但也可以是能被计算的任意值. selectors 提供了标准的选择器,以及一些选择器工厂方法.

选择器

identity 恒等函数.
asq.selectors.identity(x)

恒等函数.

identity方法只返回它的参数值.

参数:x – 将被返回的值.
返回:参数x.

示例

配合where()查询操作符来使用 identity 函数,使返回的结果集中只包含值为真的元素:

>>> from selectors import identity
>>> a = [5, 3, 0, 1, 0, 4, 2, 0, 3]
>>> query(a).where(identity).to_list()[5, 3, 1, 4, 2, 3]

选择器工厂

a_ 创建一个以属性作为名字的选择器函数.
k_ 创建一个以键作为元素索引的选择器函数.
m_ 创建一个调用有名方法的选择器.
asq.selectors.a_(name)

创建一个以属性作为名字的选择器函数.

参数:name – 将在各个元素中被检索的属性名.
返回:一个通过其唯一参数来检索有名属性并返回属性值的单元选择器.

普通等效用法

调用工厂方法:

a_(name)

等同于以下写法:

lambda element: element.name

示例

以length的大小来对飞船特性列表进行排序,并查询飞船名字:

>>> from asq.selectors import a_
>>> class SpaceShip(object):
...     def __init__(self, name, length, crew):
...         self.name = name
...         self.length = length
...         self.crew = crew
...
>>> spaceships = [SpaceShip("Nebulon-B", 300, 854),
...               SpaceShip("V-19 Torrent", 6, 1),
...               SpaceShip("Venator", 1137, 7400),
...               SpaceShip("Lambda-class T-4a shuttle", 20, 6),
...               SpaceShip("GR-45 medium transport", 90, 6)]
>>> query(spaceships).order_by(a_('length')).select(a_('name')).to_list()['V-19 Torrent', 'Lambda-class T-4a shuttle', 'GR-45 medium transport', 'Nebulon-B', 'Venator']
asq.selectors.k_(key)

创建一个以键作为元素索引的选择器函数.

参数:key – 将被选择器用来作为元素索引的键.
返回:使用键值给唯一参数添加索引的单元选择器.

普通等效写法

调用工厂函数:

k_(key)

等同于以下写法:

lambda element: element[name]

示例

从包含星球数据的字典列表中,按质量上升来对星球排序,并查询它们到太阳之间的距离:

>>> from asq.selectors import k_
>>> planets = [dict(name='Mercury', mass=0.055, period=88),
...            dict(name='Venus', mass=0.815, period=224.7),
...            dict(name='Earth', mass=1.0, period=365.3),
...            dict(name='Mars', mass=0.532, period=555.3),
...            dict(name='Jupiter', mass=317.8, period=4332),
...            dict(name='Saturn', mass=95.2, period=10761),
...            dict(name='Uranus', mass=14.6, period=30721),
...            dict(name='Neptune', mass=17.2, period=60201)]
>>> query(planets).order_by(k_('mass')).select(k_('period')).to_list()[88, 555.3, 224.7, 365.3, 30721, 60201, 10761, 4332]
asq.selectors.m_(name*args**kwargs)

创建一个调用有名方法的选择器.

参数:
  • name – 被调用于每个元素上的方法名.
  • *args – 传递到被调用方法中的任意可选的位置参数.
  • **kwargs – 传递到被调用方法中的任意可选的有名参数.
Returns:

一个单元选择器, 其用于调用带有可选位置或有名参数的方法并返回被调用方法运行后的结果.

普通等效写法

调用工厂方法:

m_(name, *args, **kwargs)

等效于以下写法:

lambda element: getattr(element, name)(*args, **kwargs)

示例

从游泳池对象列表中,通过area()方法来对每个游泳池作统计,并得出游泳池区域大小的列表:

>>> class SwimmingPool(object):
...     def __init__(self, length, width):
...         self.length = length
...         self.width = width
...     def area(self):
...         return self.width * self.length
...     def volume(self, depth):
...         return self.area() * depth
...
>>> pools = [SwimmingPool(50, 25),
...          SwimmingPool(25, 12.5),
...          SwimmingPool(100, 25),
...          SwimmingPool(10, 10)]
>>> query(pools).select(m_('area')).to_list()[1250, 312.5, 2500, 100]


假设上面的池水深2米,通过将这个深度作为一个位置参数传递到选择器工厂方法m_()中来进行计算 :

>>> query(pools).select(m_('volume', 2)).to_list()[2500, 625.0, 5000, 200]


另外, 我们可以通过使用有名参数来使代码更清晰:

>>> query(pools).select(m_('volume', depth=1.5)).to_list()[1875.0, 468.75, 3750.0, 150.0]
 
    
 类似资料: