Автор оригинала: Mike Driscoll.
Python 3.5 Добавлена дополнительная поддержка для распаковки обобщений в PEP 448 Отказ Согласно PEP, он добавил Расширенные использования оператора * неразбакиваний * ** Операторы распаковки словаря, распаковывающиеся, чтобы обеспечить распаковку в более позициях, произвольному количеству раз, а также в дополнительных обстоятельствах Отказ Это означает, что теперь мы можем сделать звонки на функции с произвольным количеством распаковки. Давайте посмотрим на пример Dict ():
>>> my_dict = {'1':'one', '2':'two'} >>> dict(**my_dict, w=6) {'1': 'one', '2': 'two', 'w': 6} >>> dict(**my_dict, w='three', **{'4':'four'}) {'1': 'one', '2': 'two', 'w': 'three', '4': 'four'}
Интересно, что если ключи являются чем-то другим, то струны, распаковка не работает:
>>> my_dict = {1:'one', 2:'two'} >>> dict(**my_dict) Traceback (most recent call last): File "", line 1, in dict(**my_dict) TypeError: keyword arguments must be strings
Обновление: Одним из моих читателей было быстро указать, что причина этого не работает, является потому, что я пытался распаковывать в функциональном вызове (I.E. Dict ()). Если бы я сделал распаковку, используя только синтаксис Dict, целочисленные клавиши работали бы нормально. Вот что я говорю о:
>>> {**{1: 'one', 2:'two'}, 3:'three'} {1: 'one', 2: 'two', 3: 'three'}
Одной из других интересных морщин для дипломной распаковки является то, что более поздние значения всегда будут переопределять более ранние. В Pep есть хороший пример, который демонстрирует это:
>>> {**{'x': 2}, 'x': 1} {'x': 1}
Я думал, что это было довольно аккуратно. Вы можете сделать такую же вещь с цепочком из модуля коллекций, но это довольно проще.
Однако этот новый распаковщик также работает для кортежей и списков. Попробуем комбинировать некоторые элементы разных типов в один список:
>>> my_tuple = (11, 12, 45) >>> my_list = ['something', 'or', 'other'] >>> my_range = range(5) >>> combo = [*my_tuple, *my_list, *my_range] >>> combo [11, 12, 45, 'something', 'or', 'other', 0, 1, 2, 3, 4]
Перед этим распаковывать изменения, вы бы сделали что-то подобное:
>>> combo = list(my_tuple) + list(my_list) + list(my_range) [11, 12, 45, 'something', 'or', 'other', 0, 1, 2, 3, 4]
Я думаю, что новый синтаксис на самом деле довольно удобно для таких обстоятельств. Я фактически запускал это время или два в Python 2, где это новое улучшение было бы довольно полезно.
Обертывание
Есть много других примеров PEP 448, которые довольно интересно прочитать и попробуйте в переводчике Питона. Я настоятельно рекомендую проверить его и предоставление этой функции. Я надеюсь начать использовать некоторые из этих функций в моем новом коде, когда мы наконец-то переехали в Python 3.