首页 > 解决方案 > 如何将字典作为位置参数而不是关键字参数传递

问题描述

我创建了一个函数(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 字典没有通过。

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

标签: pythondictionaryargumentsparameter-passing

解决方案


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

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

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

如果您调用 then 您的函数并在 param1、param2 之后传递任意数量的位置参数,您可以在args元组中的函数内部访问它们。因此,在您的问题示例中,您的 dict 位于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]}

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

    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}

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

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

它将打印相同的:

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

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

没有魔法,只是尝试在 python 交互式控制台中玩。


推荐阅读