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

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

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

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

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

Ответы

Ответ 1

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

Импорт не требуется:

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

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

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

Ответ 2

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

lst = list

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

del list

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


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

Ответ 3

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

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


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

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

Ответ 4

Чтобы исправить ошибку, есть еще один вариант - если мы помним, что встроенная функция 'list() на самом деле является классом, тогда мы можем просто сделать это:

list = type([])

Ответ 5

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

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

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

Из docs:

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

для py3x:

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

Ответ 6

Он всегда доступен как __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]

Ответ 7

Да, другие говорят выше, не используйте имя встроенного в качестве имени переменной. Это относится к 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'>