铁佛 发表于 2024-12-20 22:52:33

【Python】*args和**kwargs

一、*args: 吸收不定命目的位置参数

在Python中,函数定义时可以通过*args吸收恣意数目的位置参数。
这里的星号(*)告诉解释器将所有额外的位置参数打包成一个元组转达给函数。
这使得函数可以处置惩罚比预期更多的输入,而不必提前确定参数的数目。
示例1:简朴的加法盘算器

def add_numbers(*args):
    """计算传入的所有数字之和"""
    return sum(args)

print(add_numbers(1, 2, 3))      # 输出: 6
print(add_numbers(10, 20, 30, 40)) # 输出: 100
在这个例子中,add_numbers函数可以或许担当恣意数目的整数作为参数,并返回它们的总和。
这里的关键点在于*args允许我们不必为每个可能的参数都定义一个变量名,从而使函数更加通用。
示例2:转发参数给另一个函数

偶然候你可能会有一个函数A需要调用另一个函数B,并且希望把所有吸收到的参数直接转达给B。
这时就可以使用*args:
def wrapper_function(*args):
    print("Calling the wrapped function with:", args)
    result = wrapped_function(*args)# 解包参数传递给wrapped_function
    print("Result from wrapped function:", result)
    return result

def wrapped_function(*args):
    print("Inside wrapped_function with arguments:", args)
    return sum(args)

wrapper_function(1, 2, 3)
这段代码展示了如何通过*args将一组未知长度的位置参数从一个函数转达到另一个函数中。
注意,在调用wrapped_function时,我们使用了*args来解包参数列表,确保每个元素都被看成单独的参数转达已往。
二、**kwargs: 吸收不定命目的关键字参数

与*args差别,**kwargs用于吸收关键字参数,并将它们存储在一个字典里。
这意味着你可以通过键值对的形式向函数转达参数,而不仅仅是按照位置顺序。
示例3:创建用户配置文件

假设我们要创建一个函数来天生用户的个人信息卡片,该卡片可以根据提供的信息动态调整内容:
def create_user_profile(**kwargs):
    """根据提供的信息创建用户资料"""
    profile = {}
    for key, value in kwargs.items():
      profile = value
    return profile

user_info = create_user_profile(name="Alice", age=30, city="Beijing")
print(user_info)# 输出: {'name': 'Alice', 'age': 30, 'city': 'Beijing'}
这里,create_user_profile函数吸收了多个关键字参数,并将它们保存到了名为profile的字典中。
这种方式非常适合处置惩罚那些具有可选字段的数据结构,如用户配置文件或API请求参数等。
示例4:归并多个字典

如果我们想要归并两个或更多个字典,也可以借助**kwargs来简化操纵:
def merge_dicts(dict1, **kwargs):
    """将多个字典合并为一个新的字典"""
    merged = dict1.copy()
    merged.update(kwargs)
    return merged

dict_a = {"a": 1, "b": 2}
dict_b = {"c": 3, "d": 4}

merged_dict = merge_dicts(dict_a, **dict_b)
print(merged_dict)# 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
此例中,merge_dicts函数起首复制了第一个字典的内容,然后使用update()方法添加了来自其他字典的所有键值对。
**kwargs在这里起到了关键作用,由于它允许我们将第二个字典的内容作为关键字参数转达给函数。
三、组合使用*args和**kwargs

当同时需要支持位置参数和关键字参数时,可以在同一个函数签名中同时包含*args和**kwargs。
不过要注意的是,*args总是应该出如今**kwargs之前,由于位置参数总是优先于关键字参数进行解析。
示例5:构建RESTful API请求

思量一个模拟发送HTTP GET请求的函数,它既可以吸收查询字符串形式的参数(位置参数),也可以吸收表单数据或JSON负载(关键字参数):
import requests

def make_api_request(url, *query_params, **payload):
    """构建并发送API请求"""
    response = requests.get(url, params=query_params, json=payload)
    return response.json()

response_data = make_api_request(
    "https://api.example.com/data",
    ("page", 1),
    ("limit", 10),
    page_size=50,
    sort_by="date"
)
print(response_data)
在这个例子中,make_api_request函数既能处置惩罚URL背面的查询参数(如分页信息),也能处置惩罚POST/PUT请求体中的数据(如果有的话)。
这种灵活性对于构建复杂的Web服务接口非常有用。
四、结论

通过对*args和**kwargs的理解,我们可以写出更加结实、易于维护的Python代码。
这两个特性不仅进步了函数的复用性温顺应性,还淘汰了硬编码参数列表带来的限定。
然而,正如前面提到的那样,太过依靠这些特性可能导致代码难以理解和调试。
因此,在设计API或公共接口时,应当权衡是否真的需要如此高的灵活性,以及如许做是否会捐躯代码的清晰度。
末了,值得注意的是,虽然**kwargs是标准做法,但在某些情况下你可能会看到有人使用**args。
实际上,**args并不是官方保举的写法,它会引发混淆,由于它违背了约定俗成的命名规范。
始终建议使用**kwargs来表示关键字参数的网络。
五、相关链接

参考文章:
   argparse — 用于命令行选项、参数和子命令的解析器
相关文章:
   【Python】回调
【Python】argparse模块
【Python】request函数
【Python】yield函数
【Python】Uvicorn服务器
【Python】SSE(Server-Sent Events)
【Python】pydantic库
【Python】pip用法
【Python】Starlette框架
【Python】pip用法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Python】*args和**kwargs