NameError: globale naam ‘xrange’ is niet gedefinieerd in Python 3

Ik krijg een foutmelding bij het uitvoeren van een python-programma:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 110, in <module>
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 27, in __init__
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\class\inventory.py", line 17, in __init__
builtins.NameError: global name 'xrange' is not defined

Het spel is hier.

Wat veroorzaakt deze fout?


Antwoord 1, autoriteit 100%

Je probeert een Python 2-codebase uit te voeren met Python 3. xrange()is hernoemd naar range()in Python 3.

Voer in plaats daarvan het spel uit met Python 2. Probeer het niet te porten tenzij je weet wat je doet, waarschijnlijk zullen er meer problemen zijn dan xrange()versus range().

Voor de goede orde, wat u ziet is geen syntaxisfout, maar in plaats daarvan een runtime-uitzondering.


Als je weet wat je doet en actief bezig bent een Python 2-codebase compatibel te maken met Python 3, kun je de code overbruggen door de globale naam aan je module toe te voegen als een alias voor range. (Houd er rekening mee dat u mogelijkeen bestaand gebruik van range()in de Python 2-codebase moet bijwerken met list(range(...))om ervoor te zorgen dat u nog steeds een lijstobject krijgt in Python 3):

try:
    # Python 2
    xrange
except NameError:
    # Python 3, xrange is now named range
    xrange = range
# Python 2 code that uses xrange(...) unchanged, and any
# range(...) replaced with list(range(...))

of vervang alle vormen van gebruik van xrange(...)door range(...)in de codebase en gebruik dan een andere shim om de Python 3-syntaxis te maken compatibel met Python 2:

try:
    # Python 2 forward compatibility
    range = xrange
except NameError:
    pass
# Python 2 code transformed from range(...) -> list(range(...)) and
# xrange(...) -> range(...).

Dit laatste heeft de voorkeur voor codebases die op de lange termijn alleencompatibel willen zijn met Python 3, het is gemakkelijker om dan waar mogelijk de Python 3-syntaxis te gebruiken.


Antwoord 2, autoriteit 3%

voeg xrange=rangetoe aan je code 🙂 Het werkt voor mij.


Antwoord 3, autoriteit 2%

Ik heb het probleem opgelost door deze import toe te voegen
Meer info

from past.builtins import xrange

Antwoord 4

in python 2.x wordt xrangegebruikt om een generator te retourneren, terwijl rangewordt gebruikt om een lijst te retourneren. In python 3.x is xrangeverwijderd en rangeretourneert een generator net als xrangein python 2.x. Daarom moet je in python 3.x range gebruiken in plaats van xrange.


Antwoord 5

Vervang

Python 2 xrangetot

Python 3 range

Rust allemaal hetzelfde.


Antwoord 6

Ik ben het eens met het laatste antwoord. Maar er is een andere manier om dit probleem op te lossen. Je kunt het pakket met de naam future downloaden, zoals pip install future. En voer in je .py-bestand dit “from past.builtins import xrange” in. .Deze methode is voor de situatie dat er veel xranges in je bestand zijn.

Other episodes