Почему нет "const" в Python? [закрытый]

Я пришел из фона C и изучаю Python. Отсутствие явной безопасности типов беспокоит, но я привыкаю к этому. Отсутствие встроенного контрактного программирования (чистые абстрактные классы, интерфейсы) - это то, к чему нужно привыкнуть, несмотря на все преимущества динамического языка.

однако невозможность запросить const-cortectness сводит меня с ума! Почему в Python нет констант? Почему константы уровня класса уныние?

2 ответов


C и Python принадлежат к двум различным классам языков.

первый статически наберется. Последнее динамический.

на статически типизированном языке type checker может вывести тип каждого выражения и проверить, соответствует ли это данному объявлению во время фазы "компиляция".

на динамически типизированном языке требуемая информация о типе недоступна до времени выполнения. И тип выражения может меняться от одного запуска к другому. Конечно, вы можете добавить тип проверки во время выполнения программы. Это не выбор, сделанный в Python. Это имеет для преимущества, чтобы позволить "утка набрав". Недостатком является то, что интерпретатор не может проверить правильность типа.

о const ключевое слово. Это тип модификатора. Ограничение разрешенного использования переменной (и некоторое изменение разрешенная оптимизация компилятора). Кажется довольно неэффективным проверять это во время выполнения для динамического языка. При первом анализе это означало бы проверить, является ли переменная const или не для каждого кривляния. Это можно было бы оптимизировать, но даже так, стоит ли это пользы?

помимо технических аспектов, не забывайте, что каждый язык имеет свою собственную философию. В Python обычным выбором является предпочтение " конвенции "вместо"ограничения". Например, константа должна быть написано всеми буквами. Нет технического исполнения. Это просто условность. Если вы будете следовать ему, ваша программа будет вести себя так, как ожидали "другие программисты". Если вы решите изменить "константу", Python не будет жаловаться. Но!--3-->вы должен чувствовать, что вы делаете"что-то не так". Ты нарушаешь конвенцию. Возможно, у вас есть на то причины. Может, не стоило. Ваша обязанность.

в качестве заключительного примечания в динамических языках "правильность" программа является гораздо большей ответственностью ваших модульных тестов, чем в руках компилятора. Если у вас действительно есть трудности, чтобы сделать шаг, вы найдете вокруг одни "код шашек". Это PyLint, PyChecker, PyFlakes...


Я не знаю, почему это дизайнерское решение было принято, но мое личное предположение заключается в том, что нет явного ключевого слова const, потому что ключевые преимущества констант уже доступны:

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

  • константы полезны для вызовов функций. Если вы передаете константу в качестве параметра функции, вы можете быть уверены, что он не изменился. В Python функции являются "вызов по значению", но поскольку переменные python являются ссылками, вы эффективно передаете копию ссылки. Внутри функции вы можете мутировать ссылку, но если вы переназначите ее, изменения не сохраняются за пределами области функции. Поэтому, если вы передаете число как переменную, оно фактически передается" как " константа. Переменной можно присвоить новое значение. Но за пределами функции, у вас все еще есть старый номер

более того, если бы было ключевое слово const, это создало бы асимметрию: переменные объявляются без ключевого слова, но const объявляются с ключевым словом. Логическим следствием было бы создание второго ключевого слова с именем var. Это, наверное, дело вкуса. Лично я предпочитаю минималистичный подход к объявлениям переменных.

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

наконец, вы можете взглянуть на этот фрагмент:http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991 я не уверен, что это реализация "констант уровня класса". Но я подумал, что это может быть полезно.