Подтвердить что ты не робот

Почему нет "const" в Python?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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