ฉันจะแก้ไขข้อผิดพลาด "การเยื้องที่ไม่คาดคิด" ใน python ได้อย่างไร
ฉันจะแก้ไขข้อผิดพลาด "การเยื้องที่ไม่คาดคิด" ใน python ได้อย่างไร
คำตอบ:
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 ที่ดีที่ช่วยแก้ปัญหาให้คุณได้ นอกจากนี้ยังจะทำให้โค้ดของคุณอ่านง่ายขึ้น
ใน Python ระยะห่างมีความสำคัญมากซึ่งจะทำให้โครงสร้างของบล็อกโค้ดของคุณ ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณทำให้โครงสร้างโค้ดของคุณยุ่งเหยิงตัวอย่างเช่นนี้:
def test_function() :
if 5 > 3 :
print "hello"
คุณอาจมีแท็บและช่องว่างผสมกันในไฟล์ของคุณ
ฉันขอแนะนำให้คุณใช้โปรแกรมแก้ไขไวยากรณ์ python ที่รับรู้เช่นPyScripterหรือNetbeans
เรียกใช้รหัสของคุณด้วยตัวเลือก -tt เพื่อดูว่าคุณใช้แท็บและช่องว่างไม่สอดคล้องกันหรือไม่
เปิดช่องว่างที่มองเห็นได้ในเครื่องมือแก้ไขใด ๆ ที่คุณใช้และเปิดแทนที่แท็บด้วยช่องว่าง
ในขณะที่คุณสามารถใช้แท็บกับแท็บผสม Python และช่องว่างมักจะนำไปสู่ข้อผิดพลาดที่คุณพบ การแทนที่แท็บด้วยช่องว่าง 4 ช่องเป็นแนวทางที่แนะนำสำหรับการเขียนโค้ด Python
โดยใช้การเยื้องที่ถูกต้อง Python เป็นช่องว่างที่ทราบดังนั้นคุณต้องทำตามแนวทางการเยื้องสำหรับบล็อกมิฉะนั้นคุณจะได้รับข้อผิดพลาดในการเยื้อง
หากคุณกำลังเขียน Python โดยใช้ Sublime และได้รับข้อผิดพลาดในการเยื้อง
มุมมอง -> การเยื้อง -> แปลงการเยื้องเป็นช่องว่าง
ปัญหาที่ฉันอธิบายเกิดจากโปรแกรมแก้ไขข้อความ Sublime ปัญหาเดียวกันนี้อาจเกิดจากผู้แก้ไขรายอื่นเช่นกัน โดยพื้นฐานแล้วปัญหาเกี่ยวข้องกับ Python ที่ต้องการรักษาการเยื้องในแง่ของการเว้นวรรคเมื่อเทียบกับตัวแก้ไขต่างๆที่เข้ารหัสการเยื้องในแง่ของแท็บ
ตรวจสอบให้แน่ใจว่าคุณใช้ตัวเลือก "แทรกช่องว่างแทนแท็บ" ในตัวแก้ไขของคุณ จากนั้นคุณสามารถเลือกว่าคุณต้องการความกว้างของแท็บเช่น 4 คุณสามารถค้นหาตัวเลือกเหล่านั้นได้ใน gedit ภายใต้แก้ไข -> การตั้งค่า -> ตัวแก้ไข
บรรทัดล่าง: ใช้พื้นที่ไม่ใช่แท็บ
ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อวางบางสิ่งลงใน Python interpreter (เทอร์มินัล / คอนโซล)
โปรดสังเกตว่าล่ามแปลบรรทัดว่างเป็นจุดสิ้นสุดของนิพจน์ดังนั้นหากคุณวางสิ่งที่ต้องการ
def my_function():
x = 3
y = 7
ล่ามจะตีความบรรทัดว่างก่อนy = 7
เป็นจุดสิ้นสุดของนิพจน์กล่าวคือคุณกำหนดฟังก์ชันของคุณเสร็จแล้วและบรรทัดถัดไปy = 7
จะมีการเยื้องที่ไม่ถูกต้องเนื่องจากเป็นนิพจน์ใหม่
ปัญหาหนึ่งที่ดูเหมือนจะไม่ได้รับการกล่าวถึงคือข้อผิดพลาดนี้อาจเกิดขึ้นได้เนื่องจากปัญหาเกี่ยวกับรหัสที่ไม่มีส่วนเกี่ยวข้องกับการเยื้อง
ตัวอย่างเช่นใช้สคริปต์ต่อไปนี้:
def add_one(x):
try:
return x + 1
add_one(5)
สิ่งนี้จะส่งคืนIndentationError: unexpected unindent
เมื่อปัญหานั้นแน่นอนว่าเป็นexcept:
ข้อความที่ขาดหายไป
ประเด็นของฉัน: ตรวจสอบรหัสด้านบนที่มีการรายงานการเยื้อง (ยกเลิก) ที่ไม่คาดคิด!
หากการเยื้องดูเรียบร้อยให้ลองดูว่าตัวแก้ไขของคุณมีตัวเลือก "ดูช่องว่าง" หรือไม่ การเปิดใช้งานสิ่งนี้จะช่วยให้สามารถค้นหาตำแหน่งที่ผสมช่องว่างและแท็บได้
มีเคล็ดลับที่ใช้ได้ผลสำหรับฉันเสมอ:
หากคุณได้รับและไม่คาดคิดการเยื้องและคุณเห็นว่าโค้ดทั้งหมดเยื้องอย่างสมบูรณ์แบบให้ลองเปิดด้วยโปรแกรมแก้ไขอื่นและคุณจะเห็นว่าบรรทัดของโค้ดใดที่ไม่ได้เยื้อง
มันเกิดขึ้นกับฉันเมื่อใช้ vim, gedit หรือ editors แบบนั้น
พยายามใช้ตัวแก้ไขเพียง 1 ตัวสำหรับโค้ดของคุณ
เพียงคัดลอกสคริปต์ของคุณและใส่ไว้ใต้ "" "โค้ดทั้งหมดของคุณ" "" ...
ระบุบรรทัดนี้ในตัวแปร .. เช่น
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 ตอนนี้มันจะพิมพ์โค้ดเยื้องในคอนโซล แค่นั้นแหละ
สิ่งที่คุณต้องทำคือลบช่องว่างหรือช่องว่างจากจุดเริ่มต้นของรหัสต่อไปนี้
from django.contrib import admin
# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
เรียกใช้คำสั่งต่อไปนี้เพื่อแก้ไข:
autopep8 -i <filename>.py
การดำเนินการนี้จะอัปเดตรหัสของคุณและแก้ไขข้อผิดพลาดการเยื้องทั้งหมด :)
หวังว่านี่จะแก้ปัญหาได้
Notepad ++ ให้พื้นที่แท็บถูกต้อง แต่ในที่สุดก็พบปัญหาการเยื้องในโปรแกรมแก้ไขข้อความ Sublime
ใช้โปรแกรมแก้ไขข้อความ Sublime และไปทีละบรรทัด
การเยื้องใน 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]]
ขอบคุณ!