gpt4 book ai didi

python - 如何将字典作为位置参数而不是关键字参数传递

转载 作者:行者123 更新时间:2023-12-01 09:22:44 24 4
gpt4 key购买 nike

我创建了一个带有三个参数的函数 (send_to_api)。 user_id 和 event_type 采用字符串,而 event_properties 采用字典,我将其作为位置参数传递。这是外部 api 所需的格式。这是该函数的简化版本:

def send_to_api(user_id, event_type, *args):

event_args = {"user_id": user_id,
"event_type": event_type,
"event_properties": args}

data = json.dumps(event_args)
r = requests.post(url=url, data=data)

在不同的地方,该函数被这样调用:

event_properties = {"property_1": "a", "property_whatever": "b"}

send_to_api("my_user_id", "my_event", event_properties)

在熟悉了 *args 和 **kwargs 之后,我似乎仍然做错了什么,因为 event_properties 字典没有被传递。

我认为这是因为我试图将字典作为位置参数传递,这可能是原因吗?或者还有其他关于这里出了问题的指示吗?

最佳答案

为了更好地理解,您可以调试 send_to_api 函数。但简而言之:

  1. *args 用于向函数发送非关键字可变长度参数列表

    def send_to_api(param1, param2, *args):
    print(param1, param2, args)

如果你调用你的函数并在 param1、param2 之后传递任意数量的位置参数,你可以在函数内部的 args 元组中访问它们。因此,在您的问题示例中,您的字典位于 args 变量内。

    send_to_api(1,2, {"a":1, "b":2})
...
1 2 ({'a': 1, 'b': 2},)

您可以通过 args[0] 访问它,因此您的代码可能如下所示:

    def send_to_api(user_id, event_type, *args):
event_args = {"user_id": user_id,
"event_type": event_type,
"event_properties": args[0]}

但如果您可以将签名更改为这样,可能会更好:

    def send_to_api(user_id, event_type, event_properties, *args):
event_args = {"user_id": user_id,
"event_type": event_type,
"event_properties": event_properties}

对我来说,它更干净;)

如果您需要处理任意数量的位置参数 - 在函数定义中使用 *args,那么您可以在函数内的 args 元组中访问它们。

如果您需要处理任意数量的关键字参数 - 在函数定义中使用 **kwargs,然后在函数内部您可以在 kwargs 字典中访问它们。

例如:

def send_to_api(arg1, *args, **kwargs):
print(arg1, args, kwargs)

然后您可以使用以下方式调用函数:

 send_to_api(1, 2 , key1=1, key2=2)

它将打印:

 1 (2,) {'key1': 1, 'key2': 2}

所以你可以看到args是一个元组(2,); kwargs 是一个字典 {'key1': 1, 'key2': 2}

您还可以使用 unpack 运算符将 kwargs 作为字典传递给函数:

  send_to_api(1, 2, **{'key1': 1, 'key2': 2})

它会打印相同的内容:

   1 (2,) {'a': 1, 'b': 2}

因此字典 {'key1': 1, 'key2': 2} 已使用 ** 运算符解压缩为 key1=1, key2=2 关键字参数,并可在 kwargs 字典中的函数内使用。

没有什么神奇的,只是尝试在Python交互式控制台中玩。

关于python - 如何将字典作为位置参数而不是关键字参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50694011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com