Apa yang harus dilakukan dengan "Indentasi tak terduga" di python?

117

Bagaimana cara memperbaiki kesalahan "indentasi tak terduga" di python?

Kipas Macintosh
sumber
4
Fragmen kode yang menghasilkan kesalahan akan membantu kami memahami masalah Anda dengan lebih baik. Harap edit pertanyaan Anda untuk menyertakan beberapa kode.
RBerteig
7
Ini kedengarannya seperti masalah spasi bagi saya sehingga sampel kode tidak akan berguna.
James McMahon
Pertanyaan yang tidak jelas dan tidak ada jawaban yang dipilih.
rafael.js
"Bagaimana cara memperbaiki kesalahan ..."? Dengan mengidentifikasi tempat terjadinya dan memperbaiki penyebab kesalahan. Dalam kasus ini, dengan membuat lekukan pada baris tertentu terlihat seperti yang diharapkan Python ...
twalberg

Jawaban:

132

Python menggunakan spasi di awal baris untuk menentukan kapan blok kode dimulai dan diakhiri. Kesalahan yang bisa Anda dapatkan adalah:

Indentasi tak terduga. Baris kode ini memiliki lebih banyak spasi di awal daripada yang sebelumnya, tetapi yang sebelumnya bukan awal dari sub blokir (misalnya pernyataan if / while / for). Semua baris kode dalam sebuah blok harus dimulai dengan string spasi kosong yang sama persis. Misalnya:

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

Yang ini sangat umum ketika menjalankan python secara interaktif: pastikan Anda tidak meletakkan spasi ekstra sebelum perintah Anda. (Sangat mengganggu saat menyalin dan menempel kode contoh!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent tidak cocok dengan level indentasi luar mana pun. Baris kode ini memiliki lebih sedikit spasi di awal daripada yang sebelumnya, tetapi sama halnya tidak cocok dengan blok lain yang bisa menjadi bagiannya. Python tidak bisa memutuskan kemana perginya. Misalnya, berikut ini, apakah cetakan akhir seharusnya menjadi bagian dari klausa if, atau bukan?

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

Diharapkan blok berlekuk. Baris kode ini memiliki jumlah spasi yang sama di awal dengan yang sebelumnya, tetapi baris terakhir diharapkan untuk memulai blok (misalnya jika / while / untuk pernyataan, definisi fungsi).

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

Jika Anda ingin fungsi yang tidak melakukan apa-apa, gunakan "no-op" perintah lulus :

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

Mencampur tab dan spasi diperbolehkan (setidaknya pada versi Python saya), tetapi Python mengasumsikan tab sepanjang 8 karakter, yang mungkin tidak cocok dengan editor Anda. Cukup ucapkan "tidak" ke tab. Kebanyakan editor mengizinkannya untuk diganti secara otomatis dengan spasi.

Cara terbaik untuk menghindari masalah ini adalah dengan selalu menggunakan jumlah spasi yang konsisten saat Anda membuat sub-blokir, dan idealnya menggunakan IDE yang baik yang memecahkan masalah untuk Anda. Ini juga akan membuat kode Anda lebih mudah dibaca.

Alice Purcell
sumber
7
penjelasan yang bagus. Selain itu, saya juga menghabiskan indentasi Unexpected error ketika dia mencampur spasi dengan 'tab' dan 'space bar' di NotePad ++, ganti 'tab' untuk 'spasi' dan perbaiki.
José Rosas Sáenz
2
@ JoséRosasSáenz Komentar Anda menyelamatkan saya begitu banyak masalah
pengguna3726345
Satu penyebab tambahan kehilangan exceptbagian tryklausa. Kode terlihat benar (dalam hal baris trytanpa indentasi dimaksudkan untuk berada di luar blok) tetapi Python melaporkan ini sebagai kesalahan 'indentasi tak terduga'. Ini diperbaiki dengan menambahkan except, mungkin menggunakan pass(seperti di sini )
dumbledad
@dumbledad Versi python mana yang Anda lihat? Ketika saya mencoba milik saya (2.7.15 dan 3.6.8), saya mendapatkan SyntaxError
Alice Purcell
Saya mengalami kesalahan ini saat menyalin / menempel kode dari situs web. Pemosisiannya tampak baik-baik saja tetapi saya perlu menghapus spasi putih dan menerapkan kembali menggunakan spasi sebelum QGIS (3.10) menjalankan kode.
benj
23

Dalam Python, jarak sangat penting, ini memberikan struktur blok kode Anda. Kesalahan ini terjadi ketika Anda mengacaukan struktur kode Anda, misalnya seperti ini:

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

Anda mungkin juga memiliki campuran tab dan spasi di file Anda.

Saya sarankan Anda menggunakan editor sadar sintaks python seperti PyScripter , atau Netbeans

yanjost
sumber
1
Ya, pasti gunakan editor yang sadar python! Saya mengalami masalah saat saya mengedit di notepad ++ dengan pengaturan default dan spasi kosong salah
Dave Archer
2
tab dan spasi campuran memunculkan "SyntaxError: penggunaan tab dan spasi yang tidak konsisten dalam indentasi"
SilentGhost
Sekadar informasi, plugin Python Netbeans saat ini tidak mengubah tab menjadi spasi dari kode yang ada. Namun, ini akan melakukannya saat Anda menulis kode baru.
James McMahon
PyCharm dapat mengubahnya secara konsisten. Juga akan menyorot garis pada "kesalahan". Saya menggunakan tanda kutip karena ini bukan tahun 1960-an dan saya tidak percaya bahasa yang luar biasa seperti Python masih memiliki kekurangan yang membuang-buang waktu dan mematikan otak ini.
Eselon
Saya secara tidak sengaja mengganti editor di tengah-tengah penulisan kode saya dan itu mengisi indentasi saya di kode yang lebih baru. Perubahan itu tidak terlihat jelas di mata, tetapi penerjemah tidak akan menjalankan kode saya. Posting ini membantu saya menemukan masalahnya.
Lucien Stals
21

Jalankan kode Anda dengan opsi -tt untuk mengetahui apakah Anda menggunakan tab dan spasi secara tidak konsisten

Manoj I
sumber
16

Aktifkan spasi yang terlihat di editor apa pun yang Anda gunakan dan aktifkan ganti tab dengan spasi.

Meskipun Anda dapat menggunakan tab dengan tab dan spasi pencampuran Python biasanya mengarah ke kesalahan yang Anda alami. Mengganti tab dengan 4 spasi adalah pendekatan yang disarankan untuk menulis kode Python.

James McMahon
sumber
1
Bagaimana Anda secara khusus melakukan ini? Saya menggunakan Sublime.
chibole
8

Dengan menggunakan lekukan yang benar. Python peka spasi, jadi Anda harus mengikuti pedoman indentasi untuk blok atau Anda akan mendapatkan kesalahan indentasi.

workmad3
sumber
6

Jika Anda menulis Python menggunakan Sublime dan mendapatkan kesalahan indentasi,

view -> indentation -> convert indentation to space

Masalah yang saya jelaskan disebabkan oleh editor teks Sublim. Masalah yang sama bisa disebabkan oleh editor lain juga. Pada dasarnya, masalah ini berkaitan dengan Python yang ingin memperlakukan lekukan dalam hal spasi versus berbagai editor yang mengkodekan lekukan dalam hal tab.

Puneet Lamba
sumber
oh ... jadi luhur yang menyebabkan ini?
nitin
Ya, masalah yang saya jelaskan disebabkan oleh Sublime. Bisa jadi disebabkan oleh editor lain juga. Pada dasarnya, masalah ini berkaitan dengan Python yang ingin memperlakukan lekukan dalam hal spasi versus berbagai editor yang mengkodekan lekukan dalam hal tab.
Puneet Lamba
Saya memiliki masalah yang sama dengan notepad ++. Apa yang terlihat mata benar jadi butuh waktu untuk memecahkan ini. Saya harus memindahkan kursor satu karakter pada satu waktu untuk mengetahui editor telah mengubah beberapa spasi putih menjadi tab
Bharat Anand
4

Pastikan Anda menggunakan opsi "sisipkan spasi, bukan tab" di editor Anda. Kemudian Anda dapat memilih lebar tab yang Anda inginkan, misalnya 4. Anda dapat menemukan opsi-opsi tersebut di gedit di bawah edit -> preferensi -> editor.

Intinya: GUNAKAN RUANG bukan tab

Alex
sumber
Intinya Anda berhasil!
Nick Div
3

Kesalahan ini juga dapat terjadi saat menempelkan sesuatu ke interpreter Python (terminal / konsol).

Perhatikan bahwa interpreter menafsirkan baris kosong sebagai akhir ekspresi, jadi jika Anda menempelkan sesuatu seperti

def my_function():
    x = 3

    y = 7

juru bahasa akan menafsirkan baris kosong sebelumnya y = 7sebagai akhir ekspresi, yaitu Anda telah selesai mendefinisikan fungsi Anda, dan baris berikutnya - y = 7akan memiliki indentasi yang salah karena ini adalah ekspresi baru.

Zoltán
sumber
kuncinya adalah bahwa baris kosong dalam definisi fungsi baik-baik saja, tetapi mereka masih harus memiliki spasi awal karena Python menafsirkan baris kosong apa pun sebagai akhir fungsi
MichaelChirico
3

Satu masalah yang sepertinya tidak disebutkan adalah bahwa kesalahan ini dapat muncul karena masalah dengan kode yang tidak ada hubungannya dengan indentasi.

Misalnya, ambil skrip berikut:

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

Ini mengembalikan IndentationError: unexpected unindentketika masalahnya tentu saja adalah except:pernyataan yang hilang .

Maksud saya: periksa kode di atas di mana indentasi yang tidak terduga (tidak) dilaporkan!

WMoreland
sumber
2

Jika lekukan terlihat ok, lihat apakah editor Anda memiliki opsi "Lihat Ruang Putih". Mengaktifkan ini akan memungkinkan untuk menemukan di mana spasi dan tab dicampur.


sumber
2

Ada trik yang selalu berhasil untuk saya:

Jika Anda mendapatkan dan indentasi yang tidak terduga dan Anda melihat bahwa semua kode menjorok dengan sempurna, coba buka dengan editor lain dan Anda akan melihat baris kode mana yang tidak diindentasi.

Itu terjadi pada saya ketika menggunakan vim, gedit atau editor seperti itu.

Coba gunakan hanya 1 editor untuk kode Anda.

Jesus Rodriguez
sumber
2

Cukup salin skrip Anda dan letakkan di bawah "" "seluruh kode" "" ...

tentukan baris ini dalam variabel .. seperti,

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

Sekarang jalankan kode ini, di Sublime Editor menggunakan ctrl + b, sekarang akan mencetak kode indentasi di konsol. itu dia

Mohideen bin Mohammed
sumber
bagaimana saya menjalankan kode saya. Apakah saya harus menghapus "" "dan" "" dan cetakan a.replace dan menjalankannya secara normal?
chibole
tidak ada "" "" "" (tanda kutip tiga) merujuk konten Anda daripada string. ini diperlukan karena kode Anda mungkin berisi string yang merupakan tanda kutip tunggal / ganda sehingga "" "diperlukan.
Mohideen bin Mohammed
2

Yang perlu Anda lakukan hanyalah menghapus spasi atau spasi tab dari awal kode berikut

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
Sunil Tamang
sumber
2

Jalankan perintah berikut untuk menyelesaikannya:

autopep8 -i <filename>.py

Ini akan memperbarui kode Anda dan menyelesaikan semua Kesalahan indentasi :)

Semoga ini akan menyelesaikannya

Sharyar Vohra
sumber
Sangat mudah diimplementasikan. Berfungsi untuk saya setiap saat itulah mengapa saya berbagi semoga bermanfaat bagi seseorang :)
Sharyar Vohra
1

Notepad ++ memberikan ruang tab yang benar tetapi masalah indentasi akhirnya ditemukan di editor teks Sublime.

Gunakan editor teks Sublime dan lanjutkan baris demi baris

HimalayanCoder
sumber
0

Indentasi di Python penting dan ini bukan untuk keterbacaan kode, tidak seperti banyak bahasa pemrograman lainnya. Jika ada spasi atau tab dalam kode Anda di antara perintah yang berurutan, python akan memberikan kesalahan ini karena Python sensitif terhadap ini. Kami cenderung mendapatkan kesalahan ini ketika kami melakukan salin dan tempel kode ke Python apa pun. Pastikan untuk mengidentifikasi dan menghapus spasi ini menggunakan editor teks seperti Notepad ++ atau secara manual hapus spasi dari baris kode tempat Anda mendapatkan kesalahan.

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

Terima kasih!

ashu Kr
sumber