2010-01-14 7 views
15

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

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

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

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

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

+0

Ошибка синтаксиса происходит потому, что 'is' является ключевым словом. В 'def maybe-even (num)' синтаксическая ошибка будет из-за дефиса. – balpha

+0

Я всегда задавался вопросом, почему ASCII имеет «-» и «_». В то время как вы задаетесь вопросом об использовании для «-», вы также можете задаться вопросом об использовании для «_» тоже? В самом деле, у меня есть много вопросов о пунктуации, которые так же важны, как и этот. Почему «#» и «♯» отличаются? Вы тоже можете подумать об этом? Мне всегда было странно, что мы не можем использовать «♯» для комментариев. –

+0

(@aatifh, см. Http://meta.stackexchange.com/questions/35582/inaccurate-revision-information - изменили ли вы тег от 'pyhon' до' python'? И, возможно, также удалили возвратный обратный ход в название?) – Arjan

ответ

35

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

my_var = is-even(another_var) 

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

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

(is-even 4) 

и

(- is (even 4)) 

в Лиспах.

+8

Что касается Lisp, то префиксный аспект не имеет значения; разница в том, что «-» не считается обязательно отдельным маркером; любая комбинация букв и «обычной» пунктуации (например, не «)») может составлять один токен. Инфиксный язык может отлично работать с такими правилами; то "' is-even (another_var) '" будет вызовом функции, а '' is - even (another_var) '" будет вычитанием, как в Lisps '(is - even 4)' является другим s-выражением от '(is-even 4)'. –

+0

Lisp не имеет этой проблемы, потому что «-» - это просто символ. –

+0

Я вижу, что для оператора минус должен использоваться '-', а нотация для инфикса хороша для читаемости (для тех, кто не вырос с помощью префиксных калькуляторов нотации). Однако есть ли веские причины, позволяющие исключить пробелы вокруг минуса и других операторов? Видя, как пробелы уже значительны в Python, почему бы не принудительно использовать пробелы вокруг операторов, которые позволяли бы использовать дефисы в именах, что, на мой взгляд, является гораздо более понятным и простым в использовании стандартом, чем как under_score, так и camelWTFCase, что я не нравится в равных количествах. –

7

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

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

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

0
is-even(num) 

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

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

Марк

+0

'is' является ключевым словом, он не может иметь значение :) – balpha

+1

Анализ может быть сложным. Вычитание значения из ключевого слова может привести к тому, что парсер будет жаловаться. –

9

Поскольку Python использует инфиксные обозначения для представления расчетов и дефиса и минус имеет точно такой же код ASCII. У вас могут быть двусмысленные случаи, такие как:

a-b = 10 
a = 1 
b = 1 

c = a-b 

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

+0

Я получил этот. Кажется, очень прямо. Любой язык, который имеет инфиксную нотацию, не может использовать дефисы. Дефис допускается только на языке, который поддерживает S-выражение. :) – aatifh

+1

Ну, язык программирования, чей собственный набор символов Юникод (они идут), может легко различать знак дефиса и минуса. Проблема в том, что слишком много языков не могут различать в своих наборах символов между символами дефисов и минус. Это бедность набора персонажей, а не бедность выразительности. –

+0

Вы правы, хотя эта способность была бы противной, если бы кто-то воспользовался ею и использовал ее в своих идентификаторах. – JPvdMerwe

Смежные вопросы