IndentationError: unindent tidak cocok dengan level indentasi luar mana pun

585

Ketika saya mengkompilasi kode Python di bawah ini, saya mengerti

IndentationError: unindent tidak cocok dengan level indentasi luar mana pun


import sys

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

Mengapa?

cbrulak
sumber
7
dan mungkin rentang (1, n +1) akan lebih baik, jika Anda ingin memasukkan 'n' dalam perhitungan Anda :-)
Abgan
7
Aku punya kesalahan yang sama, tapi saya kebetulan indent metode jalan sampai dalam kode sedikit ke kiri, yang memberikan kesalahan ini di bagian bawah berikutnya metode setelah. Jadi kesalahan ini dapat terjadi tidak hanya dari pencampuran tab dan spasi.
Kontrak Prof. Falken dilanggar
14
Saya menggunakan Sublime Text 3. Saya punya proyek Django. Saya memperbaiki kesalahan menggunakanView > Indentation > Intent Using Spaces
AbhimanyuAryan
Punya masalah ini di pycharm, mengatur tab dan mengatur jarak pada konfigurasi tidak berhasil. Masalahnya adalah saya mempunyai file ~ / .editorconfig yang mengesampingkan konfigurasi pycharm.
Ken Myers
Saya menemukan menggunakan IDLE membuatnya lebih mudah untuk menemukan masalah lekukan. Ini akan dengan jelas menemukan kesalahan lekukan yang tidak akan ditemukan oleh kebanyakan editor.
Dennis Gathagu

Jawaban:

670

Poster lain mungkin benar ... mungkin ada ruang yang tercampur dengan tab Anda. Coba lakukan pencarian & ganti untuk mengganti semua tab dengan beberapa spasi.

Coba ini:

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)
Kevin Tighe
sumber
2
ya, saya harus benar-benar ruang atas bagian loop dalam pada dua baris terakhir (hanya dalam SO). Tidak yakin mengapa ...
cbrulak
3
baris pertama saya, "hasil = 0" (yang seharusnya sudah 1, terima kasih untuk mengoreksi) diberi spasi sementara sisanya tab, sialan, tidak tahu python seperti itu
cbrulak
1
Ya, itu bisa rumit. Saya menggunakan emacs untuk mengedit python, dan saya mengaturnya untuk selalu mengganti tab dengan spasi dalam file py jadi saya tidak punya masalah ini. Notepad ++ mungkin memiliki opsi seperti ini juga.
Kevin Tighe
3
Punya masalah yang sama atm :). SublimeText menunjukkan spasi sebagai titik, cukup berguna.
Kris
Jadi tunggu sebentar, Anda dapat membuat spasi dengan ATAU tab. Anda hanya perlu konsisten? poni kepala
David
265

PENTING : Spasi adalah metode yang lebih disukai - lihat PEP008 Lekukan dan Tab atau Spasi? . (Terima kasih kepada @Siha untuk ini.)

Untuk Sublime Textpengguna:

Setel Sublime Textuntuk menggunakan tab untuk lekukan: View-> Indentation->Convert Indentation to Tabs

Hapus centang Indent Using Spacesopsi juga di sub-menu yang sama di atas. Ini akan segera menyelesaikan masalah ini.

diaktifkangeek
sumber
1
Juga setiap kali menggunakan Python, pastikan Anda mengatur opsi serupa di mana pun IDE / Text Editor yang Anda gunakan
activatedgeek
20
Juga di ATOM, Paket> Ruang Putih> Konversi Spasi menjadi Tab dan Anda akan menghindari Sakit Kepala Kesalahan Sintaksis Python!
loretoparisi
1
Spaces adalah metode yang disukai - lihat Lekukan dan Tab atau Spasi PEP008 ? . Luhur juga dapat diatur untuk melakukannya dengan cara ini.
SiHa
13
Anda mengatakan spasi adalah metode yang disukai namun jawaban Anda meminta orang untuk meminta luhur untuk menggunakan tab! Saya bingung
gota
@NunoCalaim Sayangnya, itu terjadi setelah saya menjawab pertanyaan. Jika Anda memulai proyek baru, silakan gunakan teknik ruang yang disukai. Itu sebabnya saya membuat edit dengan huruf tebal sehingga setiap pendatang baru mengetahui adanya disclaimer.
Diaktifkangeek
137

Untuk dengan mudah memeriksa masalah dengan tab / spasi Anda sebenarnya dapat melakukan ini:

python -m tabnanny yourfile.py

atau Anda dapat mengatur editor dengan benar tentu saja :-)

André
sumber
1
Saya mencoba ini dalam file dengan beberapa kesalahan indentasi tab / spasi, tetapi tidak ada output sama sekali dengan file tab yang salah. ada ide?
Luchux
1
Saya punya masalah dengan spasi dan kesalahannya mengatakan itu ada di saluran 191, tetapi berkat tabnanny saya menemukan masalah sebenarnya bukan pada saluran itu, tetapi di baris di atas.
richar8086
Terima kasih! Tip yang bagus. Kesalahan diidentifikasi oleh flake8 dalam Kode VS tetapi tidak bisa mengidentifikasi di mana masalahnya - tabnanny lakukan dalam mikrodetik.
Steve
39

Apakah Anda yakin tidak mencampur tab dan spasi di spasi putih indentasi Anda? (Itu akan menyebabkan kesalahan itu.)

Catatan, Anda disarankan tidak menggunakan tab dalam kode Python. Lihat panduan gaya . Anda harus mengonfigurasi Notepad ++ untuk menyisipkan spasi untuk tab.

zdan
sumber
Saya bingung. Jawaban di atas menyatakan untuk mengganti opsi editor teks untuk menggunakan tab alih-alih spasi.
spurra
3
@BananaCode Selama Anda menggunakan tab HANYA atau spasi HANYA, secara teknis tidak masalah yang Anda pilih. Meskipun untuk python, spasi lebih disukai, lihat tautan yang saya maksud.
zdan
21

Setiap kali saya menemukan kesalahan ini, itu karena saya entah bagaimana mencampur tab dan spasi di editor saya.

Dana
sumber
13

Jika Anda menggunakan editor IDLE Python, Anda dapat melakukan seperti yang disarankan dalam salah satu pesan kesalahan serupa:

1) pilih semua, misalnya Ctrl+A

2) Buka Format -> Wilayah Untabify

3) Periksa kembali indentasi Anda masih benar, simpan dan jalankan kembali program Anda.

Saya menggunakan Python 2.5.4

Gatica
sumber
9

Jika Anda menggunakan Vim, tekan escape dan ketik

gg = G

Auto ini membuat semua indentasi dan menjernihkan semua ruang yang Anda masukkan.

cbartondock
sumber
8

Baris: result = result * iharus di indentasi (ini adalah badan for-loop).

Atau - Anda memiliki ruang campuran dan karakter tab

Abgan
sumber
Saya harus mengubah pengeditan di SO, aneh. Lihat catatan "Edit" saya yang diperbarui dalam pertanyaan
cbrulak
Ok, jadi saya percaya bahwa baris kedua dari jawaban saya benar - Anda memiliki ruang campuran dan karakter tab (masing-masing 32 dan 8 dalam ASCII)
Abgan
5

Di Atom

pergi ke

Packages > Whitespace > Convert Spaces to Tabs

Kemudian periksa lagi lekukan file Anda:

python -m tabnanny yourFile.py

atau

>python
>>> help("yourFile.py")
loretoparisi
sumber
4

Tampaknya menjadi masalah lekukan. Anda tidak harus mencocokkan kurung keriting dengan Python tetapi Anda harus harus mencocokkan tingkat lekukan.

Cara terbaik untuk mencegah masalah ruang / tab adalah menampilkan karakter yang tidak terlihat dalam editor teks Anda. Ini akan memberi Anda cara cepat untuk mencegah dan / atau menyelesaikan kesalahan terkait lekukan.

Juga, menyuntikkan kode yang disalin adalah sumber umum untuk jenis masalah ini.

Matt Kahl
sumber
4

Jika Anda menggunakan notepad ++, lakukan "ganti" dengan mode pencarian diperluas untuk menemukan \ t dan ganti dengan empat spasi.

Jackie Lee
sumber
2

untuk Pengguna Atom, Packages ->whitspace -> remove trailing whitespaces ini bekerja untuk saya

Aha
sumber
2

Hanya tambahan. Saya memiliki masalah yang sama dengan kedua lekukan di Notepad ++.

  1. Lekukan yang tidak terkecuali
  2. Tingkat Indentasi Luar

    Buka ----> Cari tab ----> ketuk ganti ----> tekan tombol radio Diperpanjang bawah ---> Sekarang ganti \ t dengan empat spasi

    Buka ----> Cari tab ----> ketuk ganti ----> tekan tombol radio Diperpanjang di bawah ---> Sekarang ganti \ n dengan apa-apa

JumpMan
sumber
2

Saya menggunakan notebook Jupyter dan mencoba hampir semua solusi di atas (beradaptasi dengan skenario saya) untuk tidak digunakan. Saya kemudian pergi baris demi baris, menghapus semua spasi untuk setiap baris dan diganti dengan tab. Itu memecahkan masalah.

Cur123
sumber
2

Untuk pengguna Spyder goto Source> Fix Indentation untuk segera memperbaiki masalah tersebut

Hafiz Abdulbasith
sumber
1

Bisa jadi karena fungsi di atasnya tidak lekukan dengan cara yang sama. yaitu

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

Saya memiliki masalah yang sama kemarin, itu kesalahan lekukan, menggunakan editor teks luhur. Butuh berjam-jam saya mencoba memperbaikinya dan pada akhirnya saya menyalin kode ke editor teks VI dan itu bekerja dengan baik. ps python terlalu sensitif spasi, pastikan untuk tidak mencampur ruang dan tab.

pengguna3731311
sumber
1

Karena saya menyadari tidak ada jawaban khusus untuk spyder, saya akan menambahkan satu: Pada dasarnya, hati-hati melihat ifpernyataan Anda dan pastikan semua if, elifdan elsememiliki jarak yang sama yaitu mereka berada di baris yang sama di awal seperti:

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!")
NelsonGon
sumber
1

Saya memiliki fungsi yang ditentukan, tetapi tidak memiliki konten apa pun selain dari komentar fungsinya ...

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

Teriaknya:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(perhatikan bahwa garis tersebut ^ ditunjukkan tanda kosong)

-

Beberapa solusi:

1: Cukup komentari fungsinya

2: Tambahkan komentar fungsi

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

3: Tambahkan baris yang tidak melakukan apa-apa

def foo(bar):
    0

Bagaimanapun, pastikan untuk membuatnya jelas mengapa ini adalah fungsi kosong - untuk Anda sendiri, atau untuk rekan-rekan Anda yang akan menggunakan kode Anda

Cedric
sumber
The pernyataan lulus dapat berguna ada :)
KevinG
1

Pertama, hanya untuk mengingatkan Anda ada kesalahan logis Anda lebih baik menjaga hasil = 1 atau output Anda akan menjadi hasil = 0 bahkan setelah loop berjalan.

Kedua, Anda dapat menulis seperti ini:

import sys

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

  print "factorial is ",result
  return result

Meninggalkan sebuah baris akan memberi tahu shell python bahwa pernyataan FOR telah berakhir. Jika Anda memiliki pengalaman menggunakan shell python maka Anda dapat memahami mengapa kami harus meninggalkan garis.

Faisal Ahmed Farooq
sumber
1

Untuk apa nilainya, dokumen saya terlalu banyak indentasi dan ini juga melemparkan kesalahan yang sama

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

IndentationError: unindent does not match any outer indentation level

plfrick
sumber
ini memperbaiki masalah saya
bhordupur
0

Ini karena ada perpaduan tab dan spasi. Anda dapat menghapus semua spasi dan menggantinya dengan tab.

Atau, Coba tulis ini:

#!/usr/bin/python -tt

di awal kode. Baris ini menyelesaikan perbedaan antara tab dan spasi.

Eragon
sumber
0

dalam kasus saya, masalahnya adalah konfigurasi pydev di Eclipse

pydev @ Eclipse

Rui Martins
sumber
0

Jika Anda menggunakan editor Komodo, Anda dapat melakukan seperti yang disarankan di salah satu pesan kesalahan serupa:

1) pilih semua, mis. Ctrl + A

2) Buka Kode -> Wilayah Untabify

3) Periksa kembali indentasi Anda masih benar, simpan dan jalankan kembali program Anda.

Saya menggunakan Python 3.4.2

Imtiaz Pabel
sumber
0

Jika Anda menggunakan teks Sublime untuk pengembangan python, Anda dapat menghindari kesalahan dengan menggunakan paket Anaconda. Setelah menginstal Anaconda,

  1. buka file Anda dengan luhur
  2. klik kanan pada ruang terbuka
  3. pilih anaconda
  4. klik pada autoformat
  5. SELESAI Atau Tekan CTRL + ALT + R.
Kapilfreeman
sumber
0

Di intellij dengan plugin python, Ctrl + Shift + Alt untuk memformat ulang dokumen memperbaiki masalah indent / tab / spasi

Rene Ferguson
sumber
0

Untuk pengguna SPYDER : Saya menggunakan spyder 3.3.2 dengan python 3.7.1 dan saya memecahkan ini, mengatur lekukan untuk menggunakan tab, dengan langkah-langkah berikut, klik pada:

  • Alat.
  • Preferensi.
  • Editor.
  • Pengaturan lanjutan.
  • Karakter lekukan -> Tab.

Lalu saya setel ulang baris "tak dikenal" menggunakan tombol tab.

Untuk beberapa alasan, tanpa pengaturan ini, saya mendapatkan hantu IndentationError kadang-kadang.

Mike
sumber
0

Sebagai contoh:

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

Dalam kode ini situasi yang sama terjadi pada saya. Hapus saja spasi indentasi sebelumnya pada baris 2 dan 3, lalu gunakan tab atau spasi. Jangan pernah gunakan keduanya . Berikan lekukan yang tepat saat menulis kode dengan python. Untuk Sumber goto Spyder> Perbaiki Indentasi. Hal yang sama berlaku untuk Kode VC dan teks luhur atau editor lainnya. Perbaiki indentasi.

Ayush Aryan
sumber
-6

Ini terjadi terutama karena editor. Coba ubah tab ke spasi (4). IDE atau Editor python terbaik adalah pycharm, sublim, vim untuk linux.
bahkan saya juga pernah mengalami masalah yang sama, kemudian saya menemukan bahwa ada masalah pengkodean. Saya sarankan Anda juga mengubah editor Anda.

Yunus
sumber