PEP 8, почему нет пробелов вокруг «=» в аргументе ключевого слова или значения параметра по умолчанию? - PullRequest
86 голосов
/ 13 января 2012

Почему PEP 8 рекомендует не иметь пробелов вокруг = в аргументе ключевого слова или значения параметра по умолчанию ?

Это несовместимо с рекомендацией пробелов в каждом другом случае = в коде Python?

Как:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

лучше чем:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

Любые ссылки на обсуждение / объяснение Python's BDFL будет оценен.

Имейте в виду, этот вопрос больше касается kwargs, чем значений по умолчанию, я просто использовал формулировку из PEP 8.

Я не спрашиваю мнения.Я спрашиваю о причинах этого решения.Это больше похоже на вопрос , почему я бы использовал { в той же строке, что и оператор if в программе на C, а не , должен ли использовать его или нет.

Ответы [ 6 ]

62 голосов
/ 13 января 2012

Полагаю, это потому, что аргумент ключевого слова существенно отличается от присваивания переменной.

Например, есть много кода, подобного этому:

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

Как видите, имеет смысл присваивать переменную ключевому аргументу с точно таким же именем, чтобы улучшить читаемость, чтобы видеть их без пробелов. Проще понять, что мы используем ключевые аргументы, а не присваиваем переменную себе.

Кроме того, параметры имеют тенденцию идти в одной и той же строке, тогда как назначения обычно находятся в каждой отдельной строке, так что экономия места, вероятно, будет важным вопросом там.

11 голосов
/ 13 января 2012

Я бы не использовал very_long_variable_name в качестве аргумента по умолчанию.Поэтому рассмотрим это:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

сверх этого:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

Кроме того, не имеет смысла использовать переменные в качестве значений по умолчанию.Возможно, некоторые постоянные переменные (которые на самом деле не являются константами), и в этом случае я бы использовал имена, которые являются заглавными, описательными, но короткими, насколько это возможно.Так что нет другого - очень _...

8 голосов
/ 25 мая 2016

Есть плюсы и минусы.

Мне очень не нравится, как читается код, совместимый с PEP8.Я не согласен с аргументом, что very_long_variable_name=another_very_long_variable_name может быть более читабельным, чем very_long_variable_name = another_very_long_variable_name.Это не то, как люди читают.Это дополнительная когнитивная нагрузка, особенно при отсутствии подсветки синтаксиса.

Однако есть существенное преимущество.Если соблюдаются правила интервалов, это делает поиск параметров исключительно с использованием инструментов гораздо более эффективным.

8 голосов
/ 27 марта 2014

IMO, исключая пробелы для аргументов, обеспечивает более четкую визуальную группировку пар аргумент / значение;это выглядит менее загроможденным.

3 голосов
/ 08 июня 2014

Я думаю, что есть несколько причин для этого, хотя я мог бы просто рационализировать:

  1. Это экономит место, позволяя большему количеству определений функций и вызовов помещаться в одну строку и экономя больше места для аргументасами имена.
  2. Объединив каждое ключевое слово и значение, вы можете легко разделить различные аргументы пробелом после запятой.Это означает, что вы можете быстро определить, сколько аргументов вы указали.
  3. Синтаксис тогда отличается от присваивания переменных, которые могут иметь одинаковые имена.
  4. Кроме того, синтаксис (даже более) отличается от проверок равенства a == b, которые также могут быть допустимыми выражениями внутри вызова.
0 голосов
/ 04 июля 2019

Для меня это делает код более читабельным и, таким образом, является хорошим соглашением.

Я думаю, что ключевое различие с точки зрения стиля между назначениями переменных и назначениями ключевых слов функций заключается в том, что в первой строке должна быть только одна строка =, тогда как обычно на множестве =строка для последнего.

Если бы не было других соображений, мы бы предпочли от foo = 42 до foo=42, потому что последнее не в том, как обычно форматируются знаки равенства, и потому что первое приятно визуально разделяетпеременная и значение с пробелами.

Но когда в одной строке несколько назначений, мы предпочитаем от f(foo=42, bar=43, baz=44) до f(foo = 42, bar = 43, baz = 44), поскольку первое визуально разделяет несколько назначений пробелами, а второе - нет, делаянемного сложнее увидеть, где находятся пары ключевое слово / значение.

Вот еще один способ выразить это: там означает согласованность за соглашением.Эта последовательность такова: «высочайший уровень разделения» визуально проясняется через пробелы.Никаких более низких уровней разделения нет (потому что это будет перепутано с пробелами, разделяющими более высокий уровень).Для присвоения переменной самый высокий уровень разделения находится между переменной и значением.Для назначения ключевых слов функции самый высокий уровень разделения находится между самими отдельными назначениями.

...