2014-11-28 3 views
4

Мой вопрос возникает от this question, в котором пользователь запутался, неосознанно переплетая встроенный глобальный set. Есть ли простой способ заставить python предупредить вас, когда вы пытаетесь переопределить встроенный?Есть ли способ защитить встроенные в python?

Я думаю более конкретно о Mathematica. В Mathematica все встроенные элементы имеют атрибут Protected. Если вы попытаетесь переопределить Set, он скажет вам, что Set - Protected, и оставьте его без изменений, возможно, избавив вас от серьезной путаницы позже, когда вещи, которые должны работать, перестают делать это без всякой очевидной причины. Если вы действительно серьезно хотите переопределить Set, вы все равно можете это сделать - вам просто нужно это сделать Unprotect. И вы можете также использовать свои собственные символы, чтобы защитить их от случайного переопределения.

Возможно, опытные питонисты не нуждаются в этом, но было бы неплохо, если бы такие новички, как я, были что-то вроде этого. (Давай думать об этом, я был программирования Mathematica в течение 15 лет и до сих пор иногда Protected сохраняет свой бекон.)

+1

Нет, Python не будет предупреждать вас об установке имен, создающих теневые встроенные модули. Это ваша собственная ответственность. Иногда присвоение переменной 'id' - это просто билет, я бы не хотел, чтобы каждый раз, когда я это делаю, я не хочу предупреждать о встроенной функции id(). –

+3

'pylint' обнаружит это, но только ключевые слова (например,' def', 'for') будут« защищены »от переназначения. – jonrsharpe

+1

Используйте linter, если вас беспокоит такая вещь; хороший linter предупредит вас об этом и многом другом. –

ответ

4

Использование http://www.pylint.org/

def set(): 
    pass 

будет генерировать это предупреждение:

[ W0622, set] Переопределение встроенного «набора»

Вы можете запустить его поверх своих файлов после их написания или использовать в e. г. Вим, как хочешь. Большинство IDE также генерируют такую ​​информацию.

+0

Спасибо, это полезно. Единственное ограничение, которое я вижу, это то, что он не будет очень полезен в интерактивном сеансе. Интересно, как трудно было бы добавить какую-то автоматическую литировку в 'ipython'? –

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