Значения переменных, используемые до того, как они назначены, и все же это работает, как работает этот синтаксис {k: v для k, v in ...}? - PullRequest
1 голос
/ 04 июля 2019

В приведенном ниже коде я не могу понять, как используются переменные field и value, потому что они присваиваются в следующей строке в цикле for.

Я посмотрел на for в этом синтаксисе и примерах, но не смог найти ничего полезного, что могло бы объяснить это поведение.

match = re.search(someregx, some_text)
current_row = {
    field: value.strip() if value else '' for field, value in match.groupdict().items()
}

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Это понимание слова .Это создает dict из указанных выражений.{...} эквивалентен синтаксису dict(...) в Python.(И в данном конкретном случае он специально создает dict(iterable) из iterable; см. Внизу).

Хорошо, так что же означает весь этот жаргон Python?Во-первых, рассмотрим понимание списка в Python, которое является выражением, которое создает список из заданного ввода, например:

odd_numbers = [ n for n in range(100) if n%2 == 1 ] 

Аналогично, давайте начнем с самого базового понимания слова :

{ k: v for k, v in ... } 

и отметим, что RHS match.groupdict().items() является итеративным, мы просто перебираем выводиз соответствия регулярному выражению в качестве элементов словаря .(Давайте просто напишем ... здесь и далее для RHS, чтобы минимизировать беспорядок).

Далее, добавление v if v else '' является условным выражением в Python, здесь он просто обрабатывает случай, еслиодин из value равен None и дает пустую строку '' вместо None (что (досадно) вызовет исключения, если вы попытаетесь выполнить дальнейшую обработку строки на нем, и, вероятно, мы не хотим писатьtry...except каждый раз, когда мы пытаемся обработать строку value).Это добавляет новым пользователям в Python, что if в условном выражении предшествует итерируемому, который их определяет, как вы говорите.Когда вы видите это в первый раз, это выглядит как набор ключевых слов в неправильном порядке :) (Сочетание пониманий, условных выражений и их объединения и вложения позволяет Python быть действительно выразительным и в то же время компактным.)

Следовательно, мы смотрим:

{ k: v if v else '' for k, v in ... } 

или в данном конкретном случае и вызываем ключевую переменную field:

{ field: value.strip() if value else '' for field, value in match.groupdict().items() }

Как только вы узнаете, что {...} эквивалентноdict(...), информация help(dict) помогает вам понять, что этот код создает dict(iterable) из iterable;третий случай, показанный ниже в синтаксисе для dict(...):

class dict(object)
 |  dict() -> new empty dictionary
 |
 |  dict(mapping) -> new dictionary initialized from a mapping object's
 |      (key, value) pairs
 |
 |  dict(iterable) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in iterable:
 |          d[k] = v
 | ...

Разные советы:

  • Форматирование : не форматировать фигурные скобки на отдельнойстрока, как если бы они были составным блоком операторов C / C ++ / Java, Python просто не использует такие скобки, мы очень гордимся этим :).В Python {...} эквивалентно dict(...).Поэтому всякий раз, когда вы видите фигурные скобки, вы смотрите на диктовку, вложенную диктовку, диктат списка, выражение JSON и т. Д. ...
  • ... или еще set.set по сути является диктом, который имеет ключи, но не имеет значения, например {'b', 'f', 'g'}Вы также можете иметь набор понимания , за исключением того, что вместо { k: v for k, v ... } это просто { k for k in ... }.Вот пример: odd_numbers = { n for n in range(100) if n%2 == 1 }.В наборах порядок не имеет значения, в отличие от кортежа.
  • Никаких окружающих пробелов: я написал дикт, список и наборы с пробелами вокруг [ ... ] или { ... }, но это было только для ясностив объяснении синтаксиса.Питонский (PEP-8) способ - не писать пробелы.
  • Краткость: в условиях сложного понимания принято давать key, value очень короткие или однобуквенные имена { k: v for k, v in ... }, особенноесли это сложные выражения, поэтому вы не тратите много времени на пустые места и нуждаетесь в огромных или обернутых строках.
  • Смежные вопросы: Создание словаря со списком , Как использоватьif / else в понимании словаря?
  • Пожалуйста, просмотрите также FAQ по программированию на Python и Функциональное программирование HOWTO , достаточно, чтобы вы поняли концепции ираспознавайте синтаксис в будущем всякий раз, когда вы увидите, что он используется, тогда вы можете вернуться и прочитать более подробно.
2 голосов
/ 04 июля 2019

Это словарь, и он эквивалентен

current_row = {}
for field, value in match.groupdict().items():
    if value:
        current_row[field] = value.strip()
    else:
        current_row[field] = ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...