จะทำอย่างไรกับ“ การเยื้องที่ไม่คาดคิด” ใน python


117

ฉันจะแก้ไขข้อผิดพลาด "การเยื้องที่ไม่คาดคิด" ใน python ได้อย่างไร


4
ส่วนรหัสที่สร้างข้อผิดพลาดจะช่วยให้เราเข้าใจปัญหาของคุณได้ดีขึ้น โปรดแก้ไขคำถามของคุณเพื่อรวมรหัสบางส่วน
RBerteig

7
สิ่งนี้ดูเหมือนจะเป็นปัญหาช่องว่างสำหรับฉันดังนั้นตัวอย่างโค้ดจะไร้ประโยชน์
James McMahon

คำถามที่คลุมเครือและไม่มีคำตอบให้เลือก
rafael.js

"ฉันจะแก้ไขข้อผิดพลาด ... " ได้อย่างไร โดยระบุตำแหน่งที่เกิดขึ้นและแก้ไขสาเหตุของข้อผิดพลาด ในกรณีนี้การทำให้การเยื้องของบรรทัดนั้นดูเหมือนสิ่งที่ Python คาดหวัง ...
twalberg

คำตอบ:


132

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

การเยื้องที่ไม่คาดคิด โค้ดบรรทัดนี้มีช่องว่างในตอนเริ่มต้นมากกว่าโค้ดก่อนหน้า แต่โค้ดก่อนหน้าไม่ใช่จุดเริ่มต้นของบล็อกย่อย (เช่น if / while / for statement) โค้ดทุกบรรทัดในบล็อกต้องขึ้นต้นด้วยสตริงช่องว่างเดียวกัน ตัวอย่างเช่น:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

สิ่งนี้เป็นเรื่องปกติโดยเฉพาะอย่างยิ่งเมื่อเรียกใช้ python แบบโต้ตอบ: ตรวจสอบให้แน่ใจว่าคุณไม่ได้เว้นวรรคก่อนคำสั่ง (น่ารำคาญมากเมื่อคัดลอกและวางโค้ดตัวอย่าง!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent ไม่ตรงกับระดับการเยื้องภายนอกใด ๆ โค้ดบรรทัดนี้มีช่องว่างในตอนเริ่มต้นน้อยกว่าโค้ดก่อนหน้า แต่ไม่ตรงกับบล็อกอื่น ๆ ที่อาจเป็นส่วนหนึ่งของ Python ไม่สามารถตัดสินใจได้ว่าจะไปที่ไหน ตัวอย่างเช่นต่อไปนี้การพิมพ์ขั้นสุดท้ายควรเป็นส่วนหนึ่งของ if clause หรือไม่?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

คาดว่าจะมีบล็อกเยื้อง โค้ดบรรทัดนี้มีจำนวนช่องว่างที่จุดเริ่มต้นเท่ากันกับโค้ดก่อนหน้า แต่บรรทัดสุดท้ายคาดว่าจะเริ่มบล็อก (เช่น if / while / for statement, function definition)

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

หากคุณต้องการฟังก์ชั่นที่ไม่ได้ทำอะไรให้ใช้ "ไม่-op คำสั่ง" ผ่าน :

>>> def foo():
...     pass

อนุญาตให้ใช้แท็บและช่องว่างผสมกัน (อย่างน้อยก็ใน Python เวอร์ชันของฉัน) แต่ Python ถือว่าแท็บมีความยาว 8 อักขระซึ่งอาจไม่ตรงกับตัวแก้ไขของคุณ เพียงพูดว่า "ไม่" กับแท็บ ตัวแก้ไขส่วนใหญ่อนุญาตให้แทนที่ด้วยช่องว่างโดยอัตโนมัติ

วิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหาเหล่านี้คือใช้จำนวนช่องว่างที่สม่ำเสมอเสมอเมื่อคุณเยื้องบล็อกย่อยและควรใช้ IDE ที่ดีที่ช่วยแก้ปัญหาให้คุณได้ นอกจากนี้ยังจะทำให้โค้ดของคุณอ่านง่ายขึ้น


7
คำอธิบายที่ดี นอกจากนั้นฉันยังใช้การเยื้องข้อผิดพลาดที่ไม่คาดคิดเมื่อเขาผสมช่องว่างกับ 'แท็บ' และ 'สเปซบาร์' ใน NotePad ++ แทนที่ 'แท็บ' สำหรับ 'ช่องว่าง' และแก้ไข
José Rosas Sáenz

2
@ JoséRosasSáenzความคิดเห็นของคุณช่วยให้ฉันมีปัญหามาก
user3726345

สาเหตุเพิ่มเติมอย่างหนึ่งที่ขาดหายไปในexceptส่วนของtryประโยค รหัสมีลักษณะถูกต้อง (เนื่องจากบรรทัดที่tryไม่ได้เยื้องหมายถึงอยู่นอกบล็อก) แต่ Python รายงานว่าเป็นข้อผิดพลาด 'การเยื้องที่ไม่คาดคิด' สิ่งนี้ได้รับการแก้ไขโดยการเพิ่มexceptบางทีอาจใช้pass(เช่นที่นี่ )
dumbledad

@dumbledad คุณเห็นงูหลามรุ่นไหน เมื่อฉันลองของฉัน (ทั้ง 2.7.15 และ 3.6.8) ฉันได้รับ SyntaxError
Alice Purcell

ฉันพบข้อผิดพลาดนี้เมื่อคัดลอก / วางโค้ดจากเว็บไซต์ การวางตำแหน่งปรากฏว่าใช้ได้ แต่ฉันต้องการลบช่องว่างและใช้ใหม่โดยใช้ช่องว่างก่อนที่ QGIS (3.10) จะรันโค้ด
benj

23

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

def test_function() :
   if 5 > 3 :
   print "hello"

คุณอาจมีแท็บและช่องว่างผสมกันในไฟล์ของคุณ

ฉันขอแนะนำให้คุณใช้โปรแกรมแก้ไขไวยากรณ์ python ที่รับรู้เช่นPyScripterหรือNetbeans


1
ใช่แน่นอนใช้โปรแกรมแก้ไข python-awareness! ฉันมีปัญหาที่ฉันแก้ไขใน notepad ++ ด้วยการตั้งค่าเริ่มต้นและมันทำให้ช่องว่างผิด
Dave Archer

2
แท็บและช่องว่างผสมเพิ่ม "SyntaxError: การใช้แท็บและช่องว่างที่ไม่สอดคล้องกันในการเยื้อง"
SilentGhost

เช่นเดียวกับในตอนนี้ปลั๊กอิน Python Netbeans ไม่ได้แปลงแท็บเป็นช่องว่างจากโค้ดที่มีอยู่ อย่างไรก็ตามมันจะทำเมื่อคุณเขียนโค้ดใหม่
James McMahon

PyCharm สามารถแปลงได้อย่างสม่ำเสมอ นอกจากนี้ยังจะเน้นบรรทัดที่ "ความผิด" ฉันใช้คำพูดเพราะนี่ไม่ใช่ปี 1960 และฉันไม่อยากเชื่อเลยว่าภาษาที่ยอดเยี่ยมเช่น Python ยังคงมีข้อบกพร่องที่ทำให้สมองเสียเวลาและเสียเวลา
Echelon

ฉันเปลี่ยนบรรณาธิการโดยไม่ได้ตั้งใจครึ่งทางด้วยการเขียนโค้ดของฉันและมันก็ยัดเยื้องของฉันลงในโค้ดที่ใหม่กว่า การเปลี่ยนแปลงไม่ชัดเจนในสายตา แต่ล่ามจะไม่เรียกใช้รหัสของฉัน โพสต์นี้ช่วยให้ฉันพบปัญหา
Lucien Stals

21

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


16

เปิดช่องว่างที่มองเห็นได้ในเครื่องมือแก้ไขใด ๆ ที่คุณใช้และเปิดแทนที่แท็บด้วยช่องว่าง

ในขณะที่คุณสามารถใช้แท็บกับแท็บผสม Python และช่องว่างมักจะนำไปสู่ข้อผิดพลาดที่คุณพบ การแทนที่แท็บด้วยช่องว่าง 4 ช่องเป็นแนวทางที่แนะนำสำหรับการเขียนโค้ด Python


1
คุณทำสิ่งนี้โดยเฉพาะอย่างไร? ฉันใช้ Sublime
chibole

8

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


6

หากคุณกำลังเขียน Python โดยใช้ Sublime และได้รับข้อผิดพลาดในการเยื้อง

มุมมอง -> การเยื้อง -> แปลงการเยื้องเป็นช่องว่าง

ปัญหาที่ฉันอธิบายเกิดจากโปรแกรมแก้ไขข้อความ Sublime ปัญหาเดียวกันนี้อาจเกิดจากผู้แก้ไขรายอื่นเช่นกัน โดยพื้นฐานแล้วปัญหาเกี่ยวข้องกับ Python ที่ต้องการรักษาการเยื้องในแง่ของการเว้นวรรคเมื่อเทียบกับตัวแก้ไขต่างๆที่เข้ารหัสการเยื้องในแง่ของแท็บ


โอ้ ... ประเสริฐทำให้เกิดสิ่งนี้เหรอ?
nitin

ใช่ปัญหาที่ฉันอธิบายเกิดจาก Sublime อาจเกิดจากตัวแก้ไขอื่น ๆ เช่นกัน โดยพื้นฐานแล้วปัญหาเกี่ยวข้องกับ Python ที่ต้องการรักษาการเยื้องในแง่ของการเว้นวรรคเมื่อเทียบกับตัวแก้ไขต่างๆที่เข้ารหัสการเยื้องในแง่ของแท็บ
Puneet Lamba

ฉันมีปัญหาเดียวกันกับ notepad ++ สิ่งที่พบกับดวงตาที่แท้จริงจึงต้องใช้เวลาในการแตกนี้ ฉันต้องเลื่อนเคอร์เซอร์ทีละตัวอักษรเพื่อดูว่าตัวแก้ไขได้แปลงช่องว่างบางส่วนเป็นแท็บ
Bharat Anand

4

ตรวจสอบให้แน่ใจว่าคุณใช้ตัวเลือก "แทรกช่องว่างแทนแท็บ" ในตัวแก้ไขของคุณ จากนั้นคุณสามารถเลือกว่าคุณต้องการความกว้างของแท็บเช่น 4 คุณสามารถค้นหาตัวเลือกเหล่านั้นได้ใน gedit ภายใต้แก้ไข -> การตั้งค่า -> ตัวแก้ไข

บรรทัดล่าง: ใช้พื้นที่ไม่ใช่แท็บ


บรรทัดล่างของคุณทำเคล็ดลับ!
Nick Div

3

ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อวางบางสิ่งลงใน Python interpreter (เทอร์มินัล / คอนโซล)

โปรดสังเกตว่าล่ามแปลบรรทัดว่างเป็นจุดสิ้นสุดของนิพจน์ดังนั้นหากคุณวางสิ่งที่ต้องการ

def my_function():
    x = 3

    y = 7

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


สำคัญคือบรรทัดว่างภายในนิยามฟังก์ชันนั้นใช้ได้แต่ก็ยังต้องมีช่องว่างเริ่มต้นเนื่องจาก Python ตีความบรรทัดว่างใด ๆ เป็นจุดสิ้นสุดของฟังก์ชัน
MichaelChirico

3

ปัญหาหนึ่งที่ดูเหมือนจะไม่ได้รับการกล่าวถึงคือข้อผิดพลาดนี้อาจเกิดขึ้นได้เนื่องจากปัญหาเกี่ยวกับรหัสที่ไม่มีส่วนเกี่ยวข้องกับการเยื้อง

ตัวอย่างเช่นใช้สคริปต์ต่อไปนี้:

def add_one(x):
    try:
        return x + 1
add_one(5)

สิ่งนี้จะส่งคืนIndentationError: unexpected unindentเมื่อปัญหานั้นแน่นอนว่าเป็นexcept:ข้อความที่ขาดหายไป

ประเด็นของฉัน: ตรวจสอบรหัสด้านบนที่มีการรายงานการเยื้อง (ยกเลิก) ที่ไม่คาดคิด!


2

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


2

มีเคล็ดลับที่ใช้ได้ผลสำหรับฉันเสมอ:

หากคุณได้รับและไม่คาดคิดการเยื้องและคุณเห็นว่าโค้ดทั้งหมดเยื้องอย่างสมบูรณ์แบบให้ลองเปิดด้วยโปรแกรมแก้ไขอื่นและคุณจะเห็นว่าบรรทัดของโค้ดใดที่ไม่ได้เยื้อง

มันเกิดขึ้นกับฉันเมื่อใช้ vim, gedit หรือ editors แบบนั้น

พยายามใช้ตัวแก้ไขเพียง 1 ตัวสำหรับโค้ดของคุณ


2

เพียงคัดลอกสคริปต์ของคุณและใส่ไว้ใต้ "" "โค้ดทั้งหมดของคุณ" "" ...

ระบุบรรทัดนี้ในตัวแปร .. เช่น

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..

ตอนนี้รันโค้ดนี้ใน Sublime Editor โดยใช้ ctrl + b ตอนนี้มันจะพิมพ์โค้ดเยื้องในคอนโซล แค่นั้นแหละ


ฉันจะเรียกใช้รหัสของฉันได้อย่างไร ฉันจะต้องลบ "" "และ" "" และพิมพ์ a.replace และเรียกใช้งานได้ตามปกติหรือไม่
chibole

ไม่ "" "" "(เครื่องหมายอัญประกาศสาม) อ้างถึงเนื้อหาของคุณมากกว่าสตริง จำเป็นต้องใช้เนื่องจากรหัสของคุณอาจมีสตริงซึ่งเป็นเครื่องหมายคำพูดเดี่ยว / คู่ดังนั้นจึงจำเป็นต้องมี "" "
Mohideen bin Mohammed

2

สิ่งที่คุณต้องทำคือลบช่องว่างหรือช่องว่างจากจุดเริ่มต้นของรหัสต่อไปนี้

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

2

เรียกใช้คำสั่งต่อไปนี้เพื่อแก้ไข:

autopep8 -i <filename>.py

การดำเนินการนี้จะอัปเดตรหัสของคุณและแก้ไขข้อผิดพลาดการเยื้องทั้งหมด :)

หวังว่านี่จะแก้ปัญหาได้


ใช้งานง่ายมาก ทำงานให้ฉันทุกครั้งนั่นคือเหตุผลที่ฉันแบ่งปันหวังว่าจะเป็นประโยชน์สำหรับใครบางคน :)
Sharyar Vohra

1

Notepad ++ ให้พื้นที่แท็บถูกต้อง แต่ในที่สุดก็พบปัญหาการเยื้องในโปรแกรมแก้ไขข้อความ Sublime

ใช้โปรแกรมแก้ไขข้อความ Sublime และไปทีละบรรทัด


0

การเยื้องใน Python มีความสำคัญและไม่ได้มีไว้สำหรับการอ่านโค้ดเท่านั้นซึ่งแตกต่างจากภาษาโปรแกรมอื่น ๆ หากมีช่องว่างหรือแท็บใด ๆ ในโค้ดของคุณระหว่างคำสั่งที่ต่อเนื่องกัน python จะให้ข้อผิดพลาดนี้เนื่องจาก Python มีความอ่อนไหวต่อสิ่งนี้ เรามักจะได้รับข้อผิดพลาดนี้เมื่อเราคัดลอกและวางโค้ดลงใน Python ตรวจสอบให้แน่ใจว่าได้ระบุและลบช่องว่างเหล่านี้โดยใช้โปรแกรมแก้ไขข้อความเช่น Notepad ++ หรือลบช่องว่างออกจากบรรทัดรหัสด้วยตนเองที่คุณได้รับข้อผิดพลาด

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]]

ขอบคุณ!

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