Hoe herstel ik de fout “onverwachte inspringing” in python?
Antwoord 1, autoriteit 100%
Python gebruikt spaties aan het begin van de regel om te bepalen wanneer codeblokken beginnen en eindigen. Fouten die u kunt krijgen zijn:
Onverwachte inspringing. Deze regel code heeft meer spaties aan het begin dan de vorige, maar de vorige is niet het begin van een subblok (bijv. if/while/for statement). Alle regels code in een blok moeten beginnen met exact dezelfde reeks witruimte. Bijvoorbeeld:
>>> def a():
... print "foo"
... print "bar"
IndentationError: unexpected indent
Deze komt vooral veel voor bij het interactief uitvoeren van python: zorg ervoor dat je geen extra spaties voor je commando’s plaatst. (Heel vervelend bij het kopiëren en plakken van voorbeeldcode!)
>>> print "hello"
IndentationError: unexpected indent
Unindent komt met geen enkel buitenste inspringingsniveau overeen. Deze regel code heeft minder spaties aan het begin dan de vorige, maar komt evenmin overeen met een ander blok waarvan het deel zou kunnen uitmaken. Python kan niet beslissen waar het heen gaat. Bijvoorbeeld, in het volgende, moet de uiteindelijke afdruk deel uitmaken van de if-clausule, of niet?
>>> if user == "Joey":
... print "Super secret powers enabled!"
... print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level
Verwacht een ingesprongen blok. Deze regel code heeft hetzelfde aantal spaties aan het begin als de vorige, maar de laatste regel zou een blok beginnen (bijv. if/while/for statement, functiedefinitie).
>>> def foo():
... print "Bar"
IndentationError: expected an indented block
Als je een functie wilt die niets doet, gebruik dan het “no-op” commando pass:
>>> def foo():
... pass
Het mixen van tabs en spaties is toegestaan (tenminste in mijn versie van Python), maar Python gaat ervan uit dat tabs 8 tekens lang zijn, wat mogelijk niet overeenkomt met je editor. Zeg gewoon “nee” tegen tabs. De meeste editors laten ze automatisch vervangen door spaties.
De beste manier om deze problemen te vermijden, is door altijd een consistent aantal spaties te gebruiken wanneer u een subblok inspringt, en idealiter een goede IDE te gebruiken die het probleem voor u oplost. Dit maakt je code ook leesbaarder.
Antwoord 2, autoriteit 16%
In Python is de spatiëring erg belangrijk, dit geeft de structuur van je codeblokken.
Deze fout treedt op wanneer u uw codestructuur verknoeit, bijvoorbeeld als volgt:
def test_function() :
if 5 > 3 :
print "hello"
Misschien heb je ook een combinatie van tabs en spaties in je bestand.
Ik raad u aan een python-syntaxisbewuste editor te gebruiken, zoals PyScripter of Netbeans
Antwoord 3, autoriteit 14%
Voer uw code uit met de optie -tt om te zien of u inconsequent tabs en spaties gebruikt
Antwoord 4, autoriteit 12%
Schakel zichtbare witruimte in in de editor die u gebruikt en schakel tabs vervangen door spaties in.
Hoewel je tabbladen met Python kunt gebruiken, leidt het mixen van tabbladen en spatie meestal tot de fout die je ervaart. Tabbladen vervangen door 4 spaties is de aanbevolen aanpak voor het schrijven van Python-code.
Antwoord 5, autoriteit 6%
Door de juiste inspringing te gebruiken. Python is zich bewust van witruimte, dus je moet de inspringrichtlijnen voor blokken volgen, anders krijg je inspringfouten.
Antwoord 6, autoriteit 4%
Als je Python schrijft met Sublime en inspringfouten krijgt,
bekijk -> inspringing -> zet inspringing om in spaties
Het probleem dat ik beschrijf wordt veroorzaakt door de Sublime-teksteditor. Hetzelfde probleem kan ook door andere editors worden veroorzaakt. In wezen heeft het probleem te maken met Python die inspringingen wil behandelen in termen van spaties versus verschillende editors die de inspringingen coderen in termen van tabbladen.
Antwoord 7, autoriteit 3%
Zorg ervoor dat u de optie “spaties invoegen in plaats van tabbladen” in uw editor gebruikt. Dan kun je kiezen dat je een tabbreedte van bijvoorbeeld 4 wilt hebben. Die opties vind je in gedit onder edit–>preferences–>editor.
bottom line: GEBRUIK SPATIES, geen tabbladen
Antwoord 8, autoriteit 3%
Een probleem dat niet genoemd lijkt te zijn, is dat deze fout kan optreden als gevolg van een probleem met de code dat niets te maken heeft met inspringen.
Neem bijvoorbeeld het volgende script:
def add_one(x):
try:
return x + 1
add_one(5)
Dit geeft een IndentationError: unexpected unindent
als het probleem natuurlijk een ontbrekende except:
-instructie is.
Mijn punt: controleer de code hierboven waar het onverwachte (on)inspringen wordt gemeld!
Antwoord 9, autoriteit 3%
Voer het volgende commando uit om het op te lossen:
autopep8 -i <filename>.py
Hiermee wordt uw code bijgewerkt en worden alle inspringfouten opgelost 🙂
Ik hoop dat dit zal oplossen
Antwoord 10, autoriteit 2%
Deze fout kan ook optreden bij het plakken van iets in de Python-interpreter (terminal/console).
Houd er rekening mee dat de interpreter een lege regel interpreteert als het einde van een uitdrukking, dus als je iets plakt als
def my_function():
x = 3
y = 7
de interpreter interpreteert de lege regel vóór y = 7
als het einde van de uitdrukking, dat wil zeggen dat u klaar bent met het definiëren van uw functie, en de volgende regel – y = 7
zal een onjuiste inspringing hebben omdat het een nieuwe uitdrukking is.
Antwoord 11
Als de inspringing er goed uitziet, kijk dan of je editor een optie “Witruimte weergeven” heeft. Als u dit inschakelt, kunt u zien waar spaties en tabbladen worden gemengd.
Antwoord 12
Er is een truc die altijd voor mij heeft gewerkt:
Als je onverwachts inspringt en je ziet dat alle code perfect is ingesprongen, probeer het dan met een andere editor te openen en je zult zien welke regel code niet is ingesprongen.
Het overkwam me toen ik vim, gedit of dergelijke editors gebruikte.
Probeer slechts 1 editor voor je code te gebruiken.
Antwoord 13
Kopieer eenvoudig uw script en plaats onder “”” uw volledige code “”” …
geef deze regel op in een variabele.. zoals,
a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..
Voer nu deze code uit, in Sublime Editor met ctrl+b, nu zal het ingesprongen code in de console afdrukken. dat is het
Antwoord 14
Het enige wat u hoeft te doen is spaties of tabspaties te verwijderen vanaf het begin van de volgende codes
from django.contrib import admin
# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
Antwoord 15
Notepad++ gaf de tabruimte correct, maar het inspringingsprobleem werd uiteindelijk gevonden in de Sublime-teksteditor.
Gebruik de sublieme teksteditor en regel voor regel
Antwoord 16
Inspringing in Python is belangrijk en dit is alleen niet voor de leesbaarheid van de code, in tegenstelling tot veel andere programmeertalen.
Als er een witruimte of tab in uw code is tussen opeenvolgende opdrachten, geeft python deze fout omdat Python hier gevoelig voor is. We krijgen deze fout waarschijnlijk wanneer we code kopiëren en plakken naar een Python.
Zorg ervoor dat u deze spaties identificeert en verwijdert met een teksteditor zoals Notepad++ of handmatig de witruimte verwijdert uit de regel code waar u een foutmelding krijgt.
Step1 :Gives error
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])
Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]
Bedankt!
Antwoord 17
Het hangt af van de context. Een ander scenario dat nog niet is behandeld, is het volgende. Laten we zeggen dat je één bestand hebt met een klasse met een specifieke methode erin
class Scraper:
def __init__(self):
pass
def scrape_html(self, html: str):
pass
en onderaan het bestand heb je zoiets als
if __name__ == "__main__":
# some
# commands
# doing
# stuff
het hele bestand er zo uit laten zien
class Scraper:
def __init__(self):
pass
def scrape_html(self, html: str):
pass
if __name__ == "__main__":
# some
# commands
# doing
# stuff
Als je in scrape_html() bijvoorbeeld een if/else-statement opent
class Scraper:
def __init__(self):
pass
def scrape_html(self, html: str):
if condition:
pass
else:
if __name__ == "__main__":
parser = argparse.ArgumentParser()
Je moet pass
of wat je maar wilt toevoegen aan die else-instructie, anders krijg je
Verwacht ingesprongen blok
Unindent niet verwacht
Verwachte uitdrukking
en op de eerste rij
Onverwachte inspringing
Het toevoegen van die pass
zou al deze vier problemen oplossen.
Antwoord 18
Het hangt af van de context, maar een inspringfout wordt vaak veroorzaakt door het gebruik van tabs in plaats van spaties.
Hier zijn enkele stappen die u kunt nemen om dit te corrigeren:
- Kopieer de tabbladen of spaties die de fout veroorzaken
- Voer een zoek- en vervangopdracht uit in uw IDE (meestal Ctrl + H).
- Plak de gekopieerde tabs of spaties in de zoekbalk “Zoeken” en vervang ze allemaal door 4 spaties (ervan uitgaande dat uw IDE 4 spaties gebruikt als een “goede” inspringing)
Deze fout komt ook vaak voor als u code van externe bronnen kopieert en plakt in uw IDE, omdat de opmaak elders mogelijk niet overeenkomt met de definitie van uw IDE voor wat telt als een “goede” inspringing.