Почему Python не допускает дефисы - PullRequest
19 голосов
/ 14 января 2010

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

Попробовал функциональные языки программирования, такие как Lisp и Clojure, где разрешены дефисы. Почему python этого не делает.

# This won't work -- SyntaxError
def is-even(num):
    return num % 2

# This will work
def is_even(num):
    return num % 2

Я уверен, что сэр Гвидо, должно быть, сделал это по некоторым причинам. Я погуглил, но не смог найти ответ. Кто-нибудь может пролить свет на это?

Ответы [ 4 ]

42 голосов
/ 14 января 2010

Потому что дефис используется как оператор вычитания. Представьте, что вы могли бы иметь функцию is-even, а затем у вас был такой код:

my_var = is-even(another_var)

Является ли is-even(another_var) вызовом функции is-even или вычитает результат функции even из переменной с именем is?

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

(is-even 4)

и

(- is (even 4))

в Лиспсе.

9 голосов
/ 14 января 2010

Поскольку Python использует инфиксную нотацию для представления вычислений, дефис и минус имеют точно такой же код ascii. Вы можете иметь неоднозначные случаи, такие как:

a-b = 10
a = 1
b = 1

c = a-b

Какой ответ? 0 или 10?

7 голосов
/ 14 января 2010

Потому что это сделает парсер еще более сложным. Это было бы слишком запутанным для программистов.

Рассмотрим def is-even(num):: теперь, если is является глобальной переменной, что происходит?

Также обратите внимание, что - является оператором вычитания в Python, следовательно, это еще больше усложнит синтаксический анализ.

0 голосов
/ 14 января 2010
is-even(num)

содержит дефис? Я думал, что это вычитание значения, возвращаемого функцией, даже с аргументом num из значения is.

Как говорит @jdupont, анализ может быть сложным.

Mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...