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

Python 3 – распаковки обобщения

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: 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.