PEP 8, чому в аргументі ключових слів або значенні параметра за замовчуванням немає пробілів навколо '='?


103

Чому 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)

Будь-які посилання на дискусію / пояснення BDFL Python будуть вдячні.

Майте на увазі, це питання стосується більше kwargs, ніж значення за замовчуванням, я просто використав фразування з PEP 8.

Я не вимагаю думок. Я прошу причин, що стоять за цим рішенням. Це більше схоже на з'ясування , чому б використовувати {на тій же лінії , як ifзаяву в програмі C, що не є чи я повинен використовувати його чи ні.

Відповіді:


72

Я думаю, що це тому, що аргумент ключового слова істотно відрізняється від призначення змінної.

Наприклад, існує багато такого коду:

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

Як бачите, має сенс присвоювати змінну аргументу ключового слова, названому точно так само, тому він покращує читабельність, щоб побачити їх без пробілів. Легше визнати, що ми використовуємо аргументи ключових слів і не присвоюємо собі змінну.

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


6
це може бути так, але все ж здається дивним введення цієї ікони IMO в рекомендації щодо стилю коду для такої добре розробленої мови, щоб зберегти лише два символи. Це так, як якщо б у стилі java code було сказано, що після цього потрібно перенести {новий рядок if(зберігає таку ж кількість символів), але не у визначенні класу. Також параметр ключового слова відрізняється від значення за замовчуванням, але все ще використовує однакову рекомендацію стилю.
соучек

3
Як я вже казав, це різні речі. Є сенс писати їх по-різному.
фортран

6
Я б сказав, що це насправді не читабельніше, ніж kw1 = kw1, kw2 = kw2;), але, можливо, саме так думали Гвідо та Баррі.
соучек

1
Я прийму цю відповідь, оскільки це досить переконливо. Не заперечував би посилання, яке підтверджує це
душек-перевірка

5
Той факт, що аргумент ключових слів принципово відрізняється від присвоєння змінної, не є коректним аргументом для того, щоб мати різні конвенції IMO, оскільки різниця вже зрозуміла з контексту. Перший відбувається в межах виклику функції, а останній повинен стояти окремо на поточному рівні відступу. IMO, для імен змінних довше 5-6 символів (тобто реальна життя для більшості) варіант з пробілами зручно читати.
Аксель

13

Я б не використовував 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')

Крім того, не має сенсу використовувати змінні як значення за замовчуванням. Можливо, деякі постійні змінні (які насправді не є константами), і в такому випадку я б використовував імена, які є усіма великими літерами, описовими, але короткими, наскільки це можливо. Так що більше немає жодного _...


1
це аргументи ключових слів, подібний приклад є в PEP, я лише зробив його менш читабельним
соуччек

3
Ви говорите (по суті): щоб правильність правила пропуску було зрозумілим, пишіть дуже короткі імена змінних. Але якщо в кого є тривалі імена змінних імен, то правило пропуску несе заплутане середовище. Аргумент про те, що "це не присвоєння, тому вони різні речі", для мене це не скорочує, тому що я дбаю більше про розбірливість, ніж про семантику і тому, що якщо це не "значення за замовчуванням для завдання", то що таке це?
PatrickT

1
@PatrickT Аргумент "це не завдання, тому вони різні речі" нічого не пояснює, чому це так (філософське поняття); Це просто пояснює, чому це може бути (синтаксичне поняття).
Mateen Ulhaq

11

Є плюси і мінуси.

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

Однак є значна користь. Якщо дотримуватися правил інтервалу, це робить параметри виключно за допомогою інструментів набагато ефективнішими.


Що ж, якщо ви дотримуєтесь пробілів навколо =, пошук за допомогою інструментів не повинен відрізнятися.
NoName

10

IMO, виключаючи пробіли для аргументів, забезпечує більш чітке візуальне групування пар arg / value; вона виглядає менш захаращеною.


Я, як правило, люблю пробіли, тому я схильний ставити пробіли просто в дужках, так що всі параметри оточені простором. Але я думаю, що arg1=40це читабельніше, оскільки відносини є більш очевидними.
Чарлі Горічаназ

3

Я думаю, що для цього є кілька причин, хоча я, можливо, просто раціоналізую:

  1. Це економить простір, дозволяючи більше визначень функцій та викликів розміщуватися на одному рядку та економити більше місця для самих імен аргументів.
  2. Приєднавши кожне ключове слово та значення, ви можете легше розділити різні аргументи на пробіл після коми. Це означає, що ви можете швидко заглянути в скільки аргументів ви навели.
  3. Потім синтаксис відрізняється від змінних призначень, які можуть мати однакову назву.
  4. Крім того, синтаксис (ще більше) відрізняється від перевірок рівності, a == bякі також можуть бути дійсними виразами всередині виклику.

3

Для мене це робить код читабельнішим і, таким чином, є хорошою умовою.

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

Якби не було ніяких інших міркувань, ми вважали за краще б , foo = 42щоб foo=42, тому що останній не так, як знак рівності , як правило , відформатований, і тому , що колишній добре візуально відокремлює змінну і значення з пробілами.

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

Ось ще один спосіб покласти його: там є консистенції позаду конвенції. Ця послідовність така: "найвищий рівень поділу" стає візуально чіткішим через пробіли. Будь-яких нижчих рівнів поділу немає (оскільки це було б переплутано з пробілом, що розділяє вищий рівень). Для призначення змінних найвищий рівень поділу знаходиться між змінною та величиною. Для присвоєння ключовим словам функції найвищий рівень поділу є між окремими призначеннями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.