Для лучшего понимания вы можете просто отладить вашу send_to_api функцию.Короче говоря:
* args используется для отправки списка аргументов переменной длины без ключа в функцию
def send_to_api(param1, param2, *args):
print(param1, param2, args)
Если вызатем вызовите вашу функцию и передайте после param1, param2 любое количество позиционных аргументов, которые вы можете получить к ним внутри функции в args кортеже.Итак, в вашем примере с вопросом ваш dict находится внутри args variable.
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}
Также вы можете передать 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 dict.
Там нет магии, просто попробуйте поиграть в интерактивной консоли python.