文章
可迭代对象解包
在 Python 中,调用函数时在参数前加星号(*)就叫做「可迭代对象的解包」(iterable unpacking)
目录
在 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(),你不管后台有几个平台,都能自动、干净地把它们“挨个”传进去。#
解包的更多场景#
- 列表/元组传参
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的多个实参,代码简洁又通用。