Рубрики
Без рубрики

** или Аргументы распаковки в Python

Как вы могли бы использовать аргументы, распаковывающие фотографию Маркуса Списки на Unsplash Мы все знаем * arg … Помечено Python, начинающим.

фото Маркус Спске. на Бессмысленно

Мы все знаем * 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”