返回文章列表

文章

可迭代对象解包

在 Python 中,调用函数时在参数前加星号(*)就叫做「可迭代对象的解包」(iterable unpacking)

目录
  1. 为什么要这样做?
  2. merged = utils.merge_dict_data(data['a'], data['b'], data['c'], ...) ``` 而谁也不想手动列出所有平台的键!用 *data.values(),你不管后台有几个平台,都能自动、干净地把它们“挨个”传进去。
  3. 解包的更多场景
  4. 输出:
  5. 1
  6. (2, 3, 4)
  7. info = {'name': 'Alice', 'age': 30} greet(**info) # 等同于 greet(name='Alice', age=30) ```
  8. 小结
  9. 📎 参考文章

在 Python 中,调用函数时在参数前加星号(*)就叫做「可迭代对象的解包」(iterable unpacking)。具体到这行代码:

merged_data = utils.merge_dict_data(*data.values())

它的作用是把 data.values() 这个可迭代对象(一个包含所有子字典的 视图)拆分成一个一个的独立参数,传给 merge_dict_data,等价于:

# 假设 data = {
#   'a': dict1,
#   'b': dict2,
#   'c': dict3,
# }
# 那么 *data.values() 会把 dict1, dict2, dict3 依次传入

merged_data = utils.merge_dict_data(dict1, dict2, dict3)

为什么要这样做?#

  • 批量处理:你的 merge_dict_data 定义为

def merge_dict_data(*dicts: Optional[Mapping[str, Iterable[T]]]) -> Dict[str, List[T]]: ... ``` 其中 *dicts 表示它可以接受任意数量的位置参数,每个参数都是一个字典或 None

  • 一次性传参:如果不用解包,你就得写

merged = utils.merge_dict_data(data['a'], data['b'], data['c'], ...) ``` 而谁也不想手动列出所有平台的键!用 *data.values(),你不管后台有几个平台,都能自动、干净地把它们“挨个”传进去。#

解包的更多场景#

  1. 列表/元组传参

def add(x, y, z): return x + y + z

nums = [1, 2, 3] print(add(*nums)) # 等同于 add(1, 2, 3) 2. **剩余参数收集** python def func(a, *rest): print(a) # 第一个实参 print(rest) # 剩下的实参组成一个元组

func(1, 2, 3, 4)

输出:#

1#

(2, 3, 4)#

```

3. 字典解包成关键字参数(双星号 *) ```python def greet(name, age): print(f"Hello, {name}. You are {age}.")

info = {'name': 'Alice', 'age': 30} greet(**info) # 等同于 greet(name='Alice', age=30) ```#

小结#

  • 在调用时写 iterable,Python 会把 iterable 的每个元素当作一个单独的位置参数传给函数。
  • 结合 def func(*args) 定义,就能灵活处理任意数量的输入。
  • 在你的场景里,data.values() 正好把每个平台的数据字典都“拆”成了 merge_dict_data 的多个实参,代码简洁又通用。

📎 参考文章#