Мне норм. Накостылять можно что-то. Например, если нужно сделать поле класса неизменяемым, то можно написать дескриптор для этого. В случае с атрибутами модуля, не думаю. Да и зачем? За все время, что я пишу на питоне, у меня не было реальной необходимости в этом.
Но зачем? Есть соглашение что ВОТ_ТАКИЕ_ПЕРЕМЕННЫЕ - константы и их менять в коде не надо. Если кому-то очень захочется изменить, то как ты не костыляй - будут способы это сделать.
эхх. Пытаюсь понять, как защититься от потенциального говнокодинга. А то неприятно как-то, что если можно поменять константу, а потом код ниже работать не будет. а мне ищи
Пытаюсь понять, как защититься от потенциального говнокодинга.
Никак, питон не расчитан на настолько разумных людей. Выбирай другой язык если не хочешь писать как удак и желаешь как можно меньше пересекаться с фатальными гогнокодерами.
ну хотя бы тем, что в тех же плюсах, которые я пытаюсь осилить, если я объявил const int x = 5;то она так и будет константой. Поменять её сложнее : надо поиграться с const_cast и подменить значение. Но это сложнее сделать ИМХО, и к тому же есть шанс неплохой, что она просто не поменяется, ибо изменение константы это UB. Тестил такое изменение на gcc 4.8.4 и clang++-3.6 - на обоих меняется не всегда
есть шанс неплохой, что она просто не поменяется, ибо изменение константы это UB. Тестил такое изменение на gcc 4.8.4 и clang++-3.6 - на обоих меняется не всегда
Это особенность компилятора и проводимых компилятором оптимизаций (т.к. он имеет полное право раскрыть костанту во время компиляции единицы трансляции).
Но Python не компилируемый, а интерпретируемый, поэтому тут такого нет. Да и смысла особого нет, т.к. либы распространяются в виде исходников и никто не сможет помешать желающему залезть в исходник и поменять значение константы. Так что какой смысл в константе?
Ну если у тебя в глобально объявлена FOO_BAR в этом же модуле ты её поменять не сможешь внутни функций(без явного указания global FOO_BAR, но так никто не делает). Ты можешь только создать локальную переменную с таким же именем, но это значение будет видно только внутри скопа.
В Эрланге любая переменная - в некотором роде константа, так как, они неизменяемые. Но вообще там есть -define(CONSTNAME, 1), которую можно в коде вызвать ?CONSTNAME (вернет 1) - вот и константа. Это по-человечески и нормально. А в Питоне так: ребят, я тут написал большими буквами, это у меня типа константа, вы сделайте вид, пожалуйста, что не можете её изменять. А если из-за ошибки в коде она у тебя изменилась, значит ты говнокодер, ровняй руки.
Мне приходится иметь дело с питоном для написания GUI - клиента. Это задница, а не язык после Эрланга и даже JavaScript.
Добавлю. Мне нравится Питон как язык для простых скриптов в линуксе. Если надо быстро что-то написать, не важно как, главное быстро, питон - то, что надо. Но для серьезных приложений я никогда не выберу питон.