Python关键字可变参数
使用 **kwargs 接收任意数量的关键字参数,参数以字典形式存储。
基本语法
定义关键字可变参数
Python
def show_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
show_info(name="Alice", age=25, city="Beijing")
# name: Alice
# age: 25
# city: Beijing
kwargs 本质是字典
Python
def show_type(**kwargs):
print(type(kwargs)) # dict
print(kwargs)
show_type(a=1, b=2) # {'a': 1, 'b': 2}
混合使用
完整参数顺序
Python
def func(pos1, pos2, *args, default=10, **kwargs):
print(f"pos1={pos1}, pos2={pos2}")
print(f"args={args}, default={default}")
print(f"kwargs={kwargs}")
func(1, 2, 3, 4, default=20, name="Alice", age=25)
# pos1=1, pos2=2
# args=(3, 4), default=20
# kwargs={'name': 'Alice', 'age': 25}
顺序规则
Python
位置参数 → *args → 默认参数 → **kwargs
参数解包
字典解包为关键字参数
Python
def create_user(name, age, city):
print(f"{name}, {age}, {city}")
user_info = {"name": "Alice", "age": 25, "city": "Beijing"}
create_user(**user_info) # Alice, 25, Beijing
# 等价于
create_user(name="Alice", age=25, city="Beijing")
结合解包
Python
def process(a, b, *args, **kwargs):
print(f"a={a}, b={b}, args={args}, kwargs={kwargs}")
values = [1, 2, 3, 4]
options = {"x": 10, "y": 20}
process(*values, **options)
# a=1, b=2, args=(3, 4), kwargs={'x': 10, 'y': 20}
实际应用
配置处理
Python
def configure(**settings):
defaults = {"host": "localhost", "port": 3306}
config = {**defaults, **settings} # 合并配置
return config
print(configure(port=3307, user="admin"))
# {'host': 'localhost', 'port': 3307, 'user': 'admin'}
函数包装器
Python
def wrapper(func, **kwargs):
print(f"Arguments: {kwargs}")
return func(**kwargs)
wrapper(print, sep="-", end="!\n") # Arguments: {'sep': '-', 'end': '!\n'}
构建字典
Python
def build_dict(**kwargs):
return kwargs
result = build_dict(a=1, b=2, c=3)
print(result) # {'a': 1, 'b': 2, 'c': 3}
动态属性设置
Python
class Person:
def set_attributes(self, **attrs):
for key, value in attrs.items():
setattr(self, key, value)
p = Person()
p.set_attributes(name="Alice", age=25)
print(p.name, p.age) # Alice 25
注意事项
不能直接修改 kwargs
Python
def modify_kwargs(**kwargs):
# kwargs 是字典,可修改,但不影响外部
kwargs["new_key"] = "new_value"
return kwargs
original = {"a": 1}
result = modify_kwargs(**original)
print(original) # {'a': 1} - 不受影响
print(result) # {'a': 1, 'new_key': 'new_value'}
键必须是字符串
text
def func(**kwargs):
pass
# 正确:键是字符串
func(name="Alice")
# 错误:键不是字符串
# func(**{1: "value"}) # TypeError
要点总结
**kwargs接收任意数量关键字参数,形成字典- 调用时使用
**解包字典为关键字参数 - 参数顺序:位置 → *args → 默认 → **kwargs
- 字典解包键必须是字符串
- 常用于配置处理、动态属性设置等场景
📝 发现内容有误?点击此处直接编辑