IndentationError: unindent ไม่ตรงกับระดับการเยื้องภายนอกใด ๆ


584

เมื่อฉันรวบรวมรหัส Python ด้านล่างฉันจะได้รับ

IndentationError: unindent ไม่ตรงกับระดับการเยื้องภายนอกใด ๆ


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

ทำไม?


7
และอาจจะอยู่ในช่วง (1, 1 + n) จะดีกว่าถ้าคุณต้องการที่จะรวมถึง 'n' ในการคำนวณของคุณ :-)
Abgan

7
ฉันมีข้อผิดพลาดเหมือนกัน แต่ฉันเกิดการเยื้องวิธีขึ้นในโค้ดเล็กน้อยไปทางซ้ายซึ่งทำให้ข้อผิดพลาดนี้ที่ด้านล่างของวิธีถัดไปหลังจากนั้น ดังนั้นข้อผิดพลาดนี้สามารถเกิดขึ้นได้ไม่เพียงจากการผสมแท็บและช่องว่าง
ศ. Falken ผิดสัญญาเมื่อ

14
ฉันใช้ Sublime Text 3 ฉันมีโครงการ Django ฉันแก้ไขข้อผิดพลาดโดยใช้View > Indentation > Intent Using Spaces
AbhimanyuAryan

หากพบปัญหานี้ใน pycharm การปรับแท็บและการเว้นวรรคในการกำหนดค่าไม่ทำงาน ปัญหาคือฉันมีไฟล์ ~ / .editorconfig ที่แทนที่การกำหนดค่า pycharm
Ken Myers

ฉันพบว่าการใช้ IDLE ทำให้ง่ายต่อการค้นหาปัญหาการเยื้อง จะพบข้อผิดพลาดในการเยื้องอย่างชัดเจนที่ผู้แก้ไขส่วนใหญ่ไม่พบ
Dennis Gathagu

คำตอบ:


668

โปสเตอร์อื่น ๆ อาจถูกต้อง ... อาจมีช่องว่างปะปนกับแท็บของคุณ ลองทำการค้นหาและแทนที่เพื่อแทนที่แท็บทั้งหมดด้วยช่องว่างเล็กน้อย

ลองสิ่งนี้:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)

2
ใช่ฉันต้องเว้นพื้นที่จริงๆในส่วนวงในที่สองบรรทัดสุดท้าย (ใน SO เท่านั้น) ไม่แน่ใจว่าทำไม ...
cbrulak

3
บรรทัดแรกของฉัน "ผล = 0" (ซึ่งควร ahve รับ 1 ขอบคุณสำหรับการแก้ไข) คือการเว้นระยะห่างในขณะที่ส่วนที่เหลือได้รับแท็บยี้ไม่ทราบหลามเป็นเช่นนั้น
cbrulak

1
ใช่ว่าอาจเป็นเรื่องยุ่งยาก ฉันใช้ emacs เพื่อแก้ไข python และฉันได้ตั้งค่าไว้ให้แทนที่แท็บด้วยช่องว่างในไฟล์ py ดังนั้นฉันจึงไม่มีปัญหานี้ Notepad ++ อาจมีตัวเลือกเช่นนี้เช่นกัน
Kevin Tighe

3
มีปัญหาเดียวกัน atm :) SublimeText แสดงช่องว่างเป็นจุดซึ่งมีประโยชน์มาก
กริช

ดังนั้นคุณสามารถเยื้องกับช่องว่างหรือแท็บ คุณแค่ต้องยินยอม หัวเรียบ
David

265

สำคัญ : ช่องว่างเป็นวิธีที่ต้องการ - ดู PEP008 การเยื้องและแท็บหรือช่องว่าง? . (ขอบคุณ @Siha สำหรับสิ่งนี้)

สำหรับSublime Textผู้ใช้:

ตั้งค่าSublime Textให้ใช้แท็บสำหรับเยื้อง: View-> Indentation->Convert Indentation to Tabs

ยกเลิกการIndent Using Spacesเลือกตัวเลือกนี้ในเมนูย่อยด้านบน สิ่งนี้จะแก้ไขปัญหานี้ทันที


1
นอกจากนี้เมื่อใดก็ตามที่ใช้ Python ให้แน่ใจว่าคุณตั้งค่าตัวเลือกที่คล้ายกันในแล้วแต่จำนวนใด IDE / แก้ไขข้อความที่คุณใช้
activatedgeek

20
บน ATOM แพ็คเกจ> ช่องว่าง> แปลงช่องว่างเป็นแท็บและคุณจะหลีกเลี่ยงอาการปวดข้อผิดพลาดทางไวยากรณ์ของ Python!
loretoparisi

1
ช่องว่างเป็นวิธีที่ต้องการ - ดู PEP008 เยื้องและแท็บหรือช่องว่าง? . ประเสริฐสามารถตั้งค่าให้ทำด้วยวิธีนี้ตลอด
SiHa

13
คุณบอกว่าช่องว่างเป็นวิธีที่ต้องการ แต่คำตอบของคุณถามคนอื่นให้ถามประเสริฐให้ใช้แท็บแทน! ฉันสับสน
gota

@NunoCalaim โชคไม่ดีที่เกิดขึ้นหลังจากที่ฉันได้ตอบคำถาม หากคุณกำลังจะเริ่มโครงการใหม่โปรดใช้เทคนิคที่ต้องการของช่องว่าง นั่นคือเหตุผลที่ฉันแก้ไขเป็นตัวหนาเพื่อให้ผู้มาใหม่ทราบถึงข้อจำกัดความรับผิดชอบ
เปิดใช้งาน

137

หากต้องการตรวจสอบปัญหาเกี่ยวกับแท็บ / ช่องว่างอย่างง่ายดายคุณสามารถทำสิ่งนี้ได้จริง:

python -m tabnanny yourfile.py

หรือคุณสามารถตั้งค่าตัวแก้ไขอย่างถูกต้องแน่นอน :-)


1
ฉันลองสิ่งนี้ในไฟล์ที่มีข้อผิดพลาดการเยื้องแท็บ / ช่องว่าง แต่ไม่มีเอาต์พุตเลยด้วยไฟล์แท็บที่ไม่ถูกต้อง ความคิดใด ๆ
Luchux

1
ฉันมีปัญหากับช่องว่างและข้อผิดพลาดบอกว่ามันอยู่ในบรรทัดที่ 191 แต่ด้วย tabnanny ฉันพบว่าปัญหาที่แท้จริงไม่ได้อยู่ในบรรทัดนั้น แต่ในบรรทัดข้างต้น
richar8086

ขอบคุณ! ช่างเป็นเคล็ดลับที่ยอดเยี่ยม ข้อผิดพลาดถูกระบุโดย flake8 ใน VS Code แต่ไม่สามารถระบุได้ว่าเกิดปัญหาที่ไหน - tabnanny ทำในไมโครวินาที
Steve

39

คุณแน่ใจหรือว่าคุณไม่ได้ผสมแท็บและช่องว่างในพื้นที่สีขาวเยื้อง (ซึ่งจะทำให้เกิดข้อผิดพลาดนั้น)

หมายเหตุขอแนะนำให้คุณไม่ใช้แท็บในรหัสไพ ธ อน ดูคู่มือสไตล์ คุณควรกำหนดค่า Notepad ++ เพื่อแทรกช่องว่างสำหรับแท็บ


ฉันสับสน คำตอบข้างต้นระบุสถานะเพื่อสลับตัวแก้ไขข้อความเพื่อใช้แท็บแทนการเว้นวรรค
spurra

3
@BananaCode ตราบใดที่คุณใช้แท็บเท่านั้นหรือช่องว่างเท่านั้นในทางเทคนิคมันไม่สำคัญว่าคุณจะเลือก แม้ว่าสำหรับงูใหญ่จะต้องการช่องว่างให้ดูลิงก์ที่ฉันอ้างถึง
zdan

21

เมื่อใดก็ตามที่ฉันพบข้อผิดพลาดนี้เป็นเพราะฉันผสมแท็บและช่องว่างในตัวแก้ไขของฉัน


13

หากคุณใช้ตัวแก้ไข IDLE ของ Python คุณสามารถทำตามที่แนะนำในข้อความแสดงข้อผิดพลาดที่คล้ายกัน:

1) เลือกทั้งหมดเช่นCtrl+A

2) ไปที่รูปแบบ -> ยกเลิกการกำหนดภูมิภาค

3) ตรวจสอบการเยื้องของคุณอีกครั้งว่าถูกต้องบันทึกและรันโปรแกรมอีกครั้ง

ฉันใช้ Python 2.5.4


9

หากคุณใช้เสียงเรียกเข้าให้กด Escape แล้วพิมพ์

GG = G

รถยนต์นี้เยื้องทุกอย่างและจะล้างช่องว่างที่คุณทิ้งไว้


8

บรรทัด: result = result * iควรเยื้อง (เป็นเนื้อความของ for-loop)

หรือ - คุณมีช่องว่างและอักขระแท็บผสมกัน


ฉันต้องเปลี่ยนการแก้ไขใน SO แปลก ดูการอัปเดตของฉัน "แก้ไข" ทราบในคำถาม
cbrulak

ตกลงดังนั้นผมเชื่อว่าบรรทัดที่สองของคำตอบของฉันถูกต้อง - คุณมีพื้นที่และแท็บผสมตัวอักษร (32 และ 8 ใน ASCII ตามลำดับ)
Abgan

5

บนAtom

ไปที่

Packages > Whitespace > Convert Spaces to Tabs

จากนั้นตรวจสอบการเยื้องไฟล์อีกครั้ง:

python -m tabnanny yourFile.py

หรือ

>python
>>> help("yourFile.py")

4

ดูเหมือนจะเป็นปัญหาการเยื้อง คุณไม่จำเป็นต้องตรงกับวงเล็บปีกกาในหลาม แต่คุณไม่จำเป็นต้องตรงกับระดับการเยื้อง

วิธีที่ดีที่สุดในการป้องกันปัญหาช่องว่าง / แท็บคือการแสดงตัวอักษรที่มองไม่เห็นในเครื่องมือแก้ไขข้อความของคุณ วิธีนี้จะช่วยให้คุณสามารถป้องกันและ / หรือแก้ไขข้อผิดพลาดที่เกี่ยวข้องกับการเยื้องได้อย่างรวดเร็ว

นอกจากนี้การฉีดโค้ดคัดลอกวางเป็นแหล่งที่มาทั่วไปสำหรับปัญหาประเภทนี้


4

หากคุณใช้ notepad ++ ให้ทำ "แทนที่" ด้วยโหมดการค้นหาเพิ่มเติมเพื่อค้นหา \ t และแทนที่ด้วยช่องว่างสี่ช่อง



2

เพียงแค่เพิ่ม ฉันมีปัญหาคล้ายกันกับการเยื้องทั้งสองใน Notepad ++

  1. การเยื้องที่ไม่ได้รับการยอมรับ
  2. ระดับการเยื้องภายนอก

    ไปที่ ----> แท็บค้นหา ----> แตะที่แทนที่ ----> กดปุ่มตัวเลือกขยายด้านล่าง ---> ตอนนี้แทนที่ \ t ด้วยช่องว่างสี่ช่อง

    ไปที่ ----> แท็บค้นหา ----> แตะที่แทนที่ ----> กดปุ่มตัวเลือกขยายด้านล่าง ---> ตอนนี้แทนที่ \ n โดยไม่ใช้อะไรเลย


2

ฉันใช้สมุดบันทึก Jupyter และลองวิธีแก้ปัญหาข้างต้นเกือบทั้งหมด (ปรับให้เข้ากับสถานการณ์ของฉัน) ไม่ใช้ ฉันไปทีละบรรทัดลบช่องว่างทั้งหมดสำหรับแต่ละบรรทัดและแทนที่ด้วยแท็บ ที่แก้ไขปัญหา


2

สำหรับผู้ใช้ Spyder ไป ที่แหล่งที่มา> แก้ไขการเยื้อง เพื่อแก้ไขปัญหาทันที


1

อาจเป็นเพราะฟังก์ชั่นด้านบนมันไม่ได้เยื้องในลักษณะเดียวกัน กล่าวคือ

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")

1

ฉันมีปัญหาเดียวกันเมื่อวานนี้มันเป็นข้อผิดพลาดการเยื้องคือการใช้โปรแกรมแก้ไขข้อความประเสริฐ ใช้เวลาหลายชั่วโมงในการพยายามแก้ไขและในที่สุดฉันก็ลงเอยด้วยการคัดลอกรหัสไปยังโปรแกรมแก้ไขข้อความ VI และมันก็ใช้ได้ดี ps python ไวต่อช่องว่างมากเกินไปตรวจสอบให้แน่ใจว่าไม่ได้ผสมช่องว่างและแท็บ


1

ตั้งแต่ฉันตระหนักดีไม่มีเฉพาะคำตอบspyderที่ฉันจะเพิ่มหนึ่ง: โดยทั่วไปอย่างรอบคอบมองไปที่คุณifคำสั่งและให้แน่ใจว่าทั้งหมดif, elifและelseมีระยะห่างเดียวกับที่พวกเขาอยู่ในบรรทัดเดียวกันในช่วงเริ่มต้นเช่นดังนั้น:

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")

1

ฉันมีฟังก์ชั่นที่กำหนด แต่มันไม่ได้มีเนื้อหาใด ๆนอกเหนือจากความเห็นฟังก์ชั่นของมัน ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

มันตะโกน:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(โปรดทราบว่าบรรทัดที่^เครื่องหมายชี้ไปที่ว่างเปล่า)

-

โซลูชั่นที่หลากหลาย:

1: เพียงแสดงความคิดเห็นถึงฟังก์ชั่น

2: เพิ่มความคิดเห็นฟังก์ชั่น

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3: เพิ่มบรรทัดที่ไม่ทำอะไรเลย

def foo(bar):
    0

ไม่ว่าในกรณีใดให้แน่ใจว่าชัดเจน ว่าทำไมมันถึงเป็นฟังก์ชั่นที่ว่างเปล่า - สำหรับตัวคุณเองหรือสำหรับเพื่อนที่จะใช้รหัสของคุณ


คำสั่งผ่านอาจจะมีประโยชน์มี :)
KevinG

1

ประการแรกเพียงเพื่อเตือนคุณว่ามีข้อผิดพลาดเชิงตรรกะคุณควรรักษา result = 1 มิฉะนั้นผลลัพธ์ของคุณจะเป็นผล = 0 แม้หลังจากที่ลูปทำงาน

ประการที่สองคุณสามารถเขียนแบบนี้:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

การออกจากบรรทัดจะเป็นการบอกให้รู้ว่า python shell นั้นสำหรับคำสั่ง FOR สิ้นสุดแล้ว หากคุณมีประสบการณ์การใช้งาน python shell คุณสามารถเข้าใจได้ว่าทำไมเราถึงต้องออกจากสาย


1

สำหรับสิ่งที่คุ้มค่า docstring ของฉันถูกเยื้องมากเกินไปและสิ่งนี้ก็ทำให้เกิดข้อผิดพลาดเดียวกัน

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level


แก้ไขปัญหาของฉันแล้ว
bhordupur

0

นี่เป็นเพราะมีทั้งแท็บและช่องว่างผสมกัน คุณสามารถลบช่องว่างทั้งหมดและแทนที่ด้วยแท็บ

หรือลองเขียนสิ่งนี้:

#!/usr/bin/python -tt

ที่จุดเริ่มต้นของรหัส บรรทัดนี้จะแก้ไขความแตกต่างระหว่างแท็บและช่องว่าง



0

หากคุณใช้ตัวแก้ไข Komodo คุณสามารถทำตามที่แนะนำในข้อความแสดงข้อผิดพลาดที่คล้ายกัน:

1) เลือกทั้งหมดเช่น Ctrl + A

2) ไปที่รหัส -> ภูมิภาคไม่เปลี่ยนแปลง

3) ตรวจสอบการเยื้องของคุณอีกครั้งว่าถูกต้องบันทึกและรันโปรแกรมอีกครั้ง

ฉันใช้ Python 3.4.2


0

หากคุณใช้ข้อความ Sublime สำหรับการพัฒนาหลามคุณสามารถหลีกเลี่ยงข้อผิดพลาดได้โดยใช้แพ็คเกจ Anaconda หลังจากติดตั้ง Anaconda แล้ว

  1. เปิดไฟล์ของคุณในประเสริฐ
  2. คลิกขวาที่พื้นที่โล่ง
  3. เลือกอนาคอนดา
  4. คลิกที่จัดรูปแบบอัตโนมัติ
  5. ทำหรือกด CTRL + ALT + R


0

สำหรับผู้ใช้SPYDER : ฉันใช้ spyder 3.3.2 กับ python 3.7.1 และฉันแก้ไขสิ่งนี้ได้โดยตั้งค่าการเยื้องเพื่อใช้แท็บโดยทำตามขั้นตอนต่อไปนี้คลิกที่:

  • เครื่องมือ
  • การตั้งค่า
  • บรรณาธิการ
  • ตั้งค่าขั้นสูง.
  • อักขระการเยื้อง -> แท็บ

จากนั้นฉันรีเซ็ตบรรทัด "ไม่ปรากฏชื่อ" โดยใช้ปุ่มแท็บ

ด้วยเหตุผลบางอย่างโดยไม่ต้องตั้งค่านี้ผมได้ผี IndentationError บางครั้ง


0

ตัวอย่างเช่น:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

ในรหัสนี้สถานการณ์เดียวกันเกิดขึ้นสำหรับฉัน เพียงลบช่องว่างเยื้องก่อนหน้าของบรรทัด 2 และ 3 จากนั้นใช้แท็บหรือช่องว่าง ไม่เคยใช้ทั้ง ให้การเยื้องที่เหมาะสมในขณะที่เขียนรหัสในหลาม สำหรับ Spyder goto Source> แก้ไขการเยื้อง เช่นเดียวกันกับรหัส VC และข้อความประเสริฐหรือโปรแกรมแก้ไขอื่น ๆ แก้ไขการเยื้อง


-6

สิ่งนี้เกิดขึ้นส่วนใหญ่เป็นเพราะของ editor. ลองเปลี่ยนแท็บไปที่ช่องว่าง (4). ไพ ธ อนที่ดีที่สุด IDE หรือบรรณาธิการคือ pycharm, sublime, vim สำหรับ linux
แม้ฉันก็เคยเจอปัญหาเดียวกันมาภายหลังฉันก็พบว่ามีปัญหาเรื่องการเข้ารหัสฉันขอแนะนำให้คุณเปลี่ยนโปรแกรมแก้ไข ur เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.