Fetch 模块

模块:borax.fetch

函数接口

borax.fetch 模块实现了从数据列表按照指定的一个或多个属性/键选取数据。

fetch 模块包含了以下几个函数:

  • fetch(iterable, key, *keys, default=EMPTY, defaults=None, getter=None)
  • ifetch(iterable, key, *keys, default=EMPTY, defaults=None, getter=None)
  • fetch_single(iterable, key, default=EMPTY, getter=None)
  • ifetch_multiple(iterable, *keys, defaults=None, getter=None)
  • ifetch_single(iterable, key, default=EMPTY, getter=None)

各个参数意义如下:

  • iterable:数据列表
  • key / keys:键值、属性访问方式的索引
  • default:默认值,用于选择单个属性
  • defaults:默认值字典,用于选择多个属性
  • getter:自定义访问回调函数

通常使用 fetch 函数即可。

基本使用

选取单个属性

objects 数据获取 name 的数据。

  1. from borax.fetch import fetch
  2. objects = [
  3. {'id': 282, 'name': 'Alice', 'age': 30},
  4. {'id': 217, 'name': 'Bob', 'age': 56},
  5. {'id': 328, 'name': 'Charlie', 'age': 56},
  6. ]
  7. names = fetch(objects, 'name')
  8. print(names)

输出

  1. ['Alice', 'Bob', 'Charlie']

选取多个属性

objects 数据获取 nameage 的数据。

  1. from borax.fetch import fetch
  2. objects = [
  3. {'id': 282, 'name': 'Alice', 'age': 30},
  4. {'id': 217, 'name': 'Bob', 'age': 56},
  5. {'id': 328, 'name': 'Charlie', 'age': 56},
  6. ]
  7. names, ages = fetch(objects, 'name', 'age')
  8. print(names)
  9. print(ages)

输出

  1. ['Alice', 'Bob', 'Charlie']
  2. [30, 56, 56]

提供默认值

iterable 数据列表缺少某个属性/键,可以通过指定 defaultdefaults 参数提供默认值。

  1. from borax.fetch import fetch
  2. objects = [
  3. {'id': 282, 'name': 'Alice', 'age': 30, 'gender': 'female'},
  4. {'id': 217, 'name': 'Bob', 'age': 56},
  5. {'id': 328, 'name': 'Charlie', 'gender': 'male'},
  6. ]
  7. print('Demo for one default value')
  8. genders = fetch(objects, 'gender', default='unknown')
  9. print(genders)
  10. print('Demo for multiple default values')
  11. ages, genders = fetch(objects, 'age', 'gender', defaults={'age': 0, 'gender':'unknown'})
  12. print(genders)
  13. print(ages)

结果输出

  1. Demo for one default value
  2. ['female', 'unknown', 'male']
  3. Demo for multiple default values
  4. ['female', 'unknown', 'male']
  5. [30, 56, 0]

属性访问

除了上述的键值访问方式,fetch 函数还内置属性访问的获取方式。

  1. from borax.fetch import fetch
  2. class Point:
  3. def __init__(self, x, y, z):
  4. self.x = x
  5. self.y = y
  6. self.z = z
  7. points = [
  8. Point(1, 2, 3),
  9. Point(4, 5, 6),
  10. Point(7, 8, 9)
  11. ]
  12. print('Fetch x values:')
  13. x = fetch(points, 'x')
  14. print(x)
  15. print('Fetch x,y,z values:')
  16. x, y, z = fetch(points, 'x', 'y', 'z')
  17. print(x)
  18. print(y)
  19. print(z)

结果输出

  1. Fetch x values:
  2. [1, 4, 7]
  3. Fetch x,y,z values:
  4. [1, 4, 7]
  5. [2, 5, 8]
  6. [3, 6, 9]

自定义Getter

除了内置的属性访问方式 itemgetter 和键值访问方式 attrgetter 外,fetch 函数还通过 getter 参数支持自定义访问方式。

getter 需满足下列的几个条件:

  • 是一个函数,命名函数或匿名函数均可
  • 该函数必须含有 itemkey 两个参数
  • 返回是具体的数值

例子:

  1. from borax.fetch import fetch
  2. class Point:
  3. def __init__(self, index, x, y, z):
  4. self.index = index
  5. self._data = {'x': x, 'y': y, 'z': z}
  6. def get(self, key):
  7. return self._data.get(key)
  8. points = [
  9. Point('a', 1, 2, 3),
  10. Point('b', 4, 5, 6),
  11. Point('c', 7, 8, 9)
  12. ]
  13. def point_getter(item, key):
  14. return item.get(key)
  15. print('Fetch x values:')
  16. x = fetch(points, 'x', getter=point_getter)
  17. print(x)
  18. print('Fetch x,y,z values:')
  19. x, y, z = fetch(points, 'x', 'y', 'z', getter=point_getter)
  20. print(x)
  21. print(y)
  22. print(z)

结果输出

  1. Fetch x values:
  2. [1, 4, 7]
  3. Fetch x,y,z values:
  4. [1, 4, 7]
  5. [2, 5, 8]
  6. [3, 6, 9]

需要注意的是,自定义 Getter 是应用至所有属性的,内置的 属性访问方式键值访问方式 将不再使用,混用将可能无法获得期望的结果。

错误的示例1

  1. >>> indexes, xs = fetch(points, 'index', 'x', getter=point_getter)
  2. [None, None, None]
  3. [1, 4, 7]

错误的示例2

  1. >>> indexes, xs = fetch(points, 'index', 'x')
  2. Traceback (most recent call last):
  3. TypeError: 'Point' object is not subscriptable

应当分别调用 fetch 函数。

正确的用法

  1. x, y = fetch(points, 'x', 'y', getter=point_getter)
  2. print(x)
  3. print(y)
  4. indexes = fetch(points, 'index')
  5. print(indexes)

结果输出

  1. [1, 4, 7]
  2. [2, 5, 8]
  3. ['a', 'b', 'c']