Именование конфликта со встроенной функцией

Я допустил ошибку, как показано ниже:

>>> list = ['a', 'b', 'c'] 

Но теперь я хочу использовать встроенный list() функций list() . Как вы можете видеть, существует конфликт имен между list listname и встроенным list() функций list() .

Как использовать list как встроенную функцию, а не переменную без перезапуска оболочки Python?

Используйте __builtins__.list или __builtins__['__list__'] (в зависимости от контекста) или просто снова удалите list ( del list ).

Нет необходимости в импорте:

 >>> __builtins__.list <type 'list'> 

Наличие __builtins__ является деталью реализации CPython; в модуле __main__ это модуль, везде он является модулем __dict__ dictionary. Jython, IronPython и PyPy могут не делать этого доступным вообще. Используйте модуль __builtin__ для этих платформ или для совместимых с Python 3 версий, builtins модуль :

 >>> import __builtin__ >>> __builtin__.list <type 'list'> 

Шаг первый : переустановите список на другое имя

 lst = list 

Шаг второй : удалите переменную list

 del list 

Шаг третий : не делайте этого снова


Я предпочитаю это над __builtins__.list Просто потому, что он сохраняет ввод, и вы все еще не остаетесь с переменным именем list . Однако всегда лучше всего избежать проблемы. При написании производственного кода всегда помните, что переменные не называются такими же, как встроенные функции.

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

Не только это – но использование списка «список» для списка очень неоднозначно, и я сомневаюсь, что он даже удаленно можно использовать в любом реальном коде.


Есть несколько причин, по которым вы никогда не должны затенять встроенный. Ниже приведены некоторые из наиболее серьезных:

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

Чтобы исправить ошибку, есть еще один вариант – если мы помним, что встроенный «function» list() на самом деле является классом, тогда мы можем просто сделать это:

 list = type([]) 

используйте __builtin__.list в py2x:

 >>> import __builtin__ >>> __builtin__.list <type 'list'> 

Не используйте __builtins__.list :

Из документов :

Подробности реализации CPython: пользователи не должны касаться __builtins__ ; это строго деталь реализации. Пользователи, которые хотят переопределить значения в пространстве имен builtins должны импортировать модуль __builtin__ (no 's) и соответствующим образом изменить его атрибуты.

для py3x:

 >>> import builtins >>> builtins.list <class 'list'> 

Он всегда доступен как __builtins__.list :

 >>> __builtins__.list <class 'list'> >>> list = [1, 2, 3] >>> __builtins__.list <class 'list'> 

Если вам случится повторить это , однако, у вас нет вариантов.

Вы также можете использовать модуль __builtin__ (или builtins , без подчеркивания, в Python 3), но вы должны его импортировать. Но это разные способы произнести одно и то же, а не быть дополнительным вариантом – модификация влияет на обоих:

 >>> import builtins >>> builtins.list <class 'list'> >>> builtins.list = [1, 2, 3] >>> builtins.list [1, 2, 3] >>> __builtins__.list [1, 2, 3] 

Да, другие говорят выше, не используйте имя встроенного в качестве имени переменной. Это относится к list , dict и т. Д.

Аналогично, как говорили другие, у вас есть доступ к list типов через __builtins__.list . Поэтому, если вам нужен list звонков, вы все равно можете его найти, если у вас нет отскока __builtins__.list также.

Важно отметить, что list – это имя. Вы отскакиваете его до экземпляра списка. Если вы хотите, чтобы list снова означал <type 'list'> , просто повторите его снова. В Python 2.7:

 >>> __builtins__.list <type 'list'> >>> list <type 'list'> >>> list = [1, 2, 3] >>> list [1, 2, 3] >>> fred = list >>> fred [1, 2, 3] >>> list = __builtins__.list >>> list <type 'list'>