Именование конфликта со встроенной функцией
Я допустил ошибку, как показано ниже:
>>> 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'>