фото Маркус Спске. на Бессмысленно
Мы все знаем * args
и ** kwargs
в функциональных параметрах. Это говорит о том, что args
Позиционные аргументы, однако многие вы хотите предоставить. И kwargs
Это аргументы ключевых слов, однако многие также. Мы не ограничиваемся названием их args
и kwargs.
только все делают это И это удобно назвать их таким образом.
def foo(a, b, *args, **kwargs): print(a) print(b) print([arg for arg in args]) print([f'{k}: {v}' for k, v in kwargs.items()]) foo(1, 2, 3, 4, f=5, g=6) 1 2 [3, 4] ['f: 5', 'g: 6']
1
и 2
наши необходимые аргументы. 3
и 4
будет наши args. f = 5.
и g = 6
кварги.
Но крутая вещь, которую я начал реализовать не так давно, это аргументы распаковки. По сути, вы сообщаете свою функцию, чтобы получить список или словарь аргументов и использовать значения (или клавиши и значения) в качестве параметров.
foo(*[1, 2]) 1 2 [] [] foo(1, 2, **{'f': 3}) 1 2 [] ['f: 3']
В каком-то странном сценарии вам может понадобиться куча аргументов в вашей функции. Поэтому вместо того, чтобы объявлять все эти параметры, которые вы можете использовать ** kwargs
Отказ И вместо того, чтобы писать каждый параметр на функцию вызова вы могли бы использовать аргументы распаковки.
Кроме того, вы можете использовать распаковку в виде обновления словаря.
pets = {'cat': 1, 'dog': 1} {'cat': 1, 'dog': 1} animals = {'pig': 2, 'cow': 1, **pets} {'pig': 2, 'cow': 1, 'cat': 1, 'dog': 1}
Ящик моего использования для этого был фильтровальный запрос Django. У меня была куча фильтров, но у всех нас было несколько распространенных. Так что мой код выглядел что-то подобное:
finished_filter = { 'cakes__status': CakeStatus.FINISHED, # much more like this } Store.objects.annotate( finished=Count('cakes', filter=Q(**finished_filter), ready_to_ship=Count('cakes', filter=Q(**finished_filter, cakes__ready_to_ship=True) )
Вы получаете идею.
Я думаю, что это действительно мощный инструмент, но как всегда, не злоупотребляйте этой властью.
Оригинал: “https://dev.to/c_v_ya/or-arguments-unpacking-in-python-49d4”