python - 如何将字典作为位置参数而不是关键字参数传递
问题描述
我创建了一个函数(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函数。但简而言之:
*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 交互式控制台中玩。
推荐阅读
- asp.net - XmlReader (.net) 返回 404,带有 RSS 链接,Feedly 读取正常
- c# - 哪个需要更少的 Cpu/内存/ram... 等?
- java - 在运行时获取类的泛型类型不起作用
- machine-learning - 有没有不分配 k 的无监督学习算法
- swift - 如何使用 map 函数快速从数组中获取替代索引数据
- sqlite - 如何在 Sqlite 数据库中存储自定义 .Net 类型?
- angular - 如何将图标从一个 td 移动到另一个 td
- ios - 将 Firestore 时间戳转换为日期数据类型
- javascript - 加号在这里有什么用?
- mysql - MySQL Query - 按日期排序和日期范围内的组字段