IndentationError: unindent, herhangi bir dış girinti seviyesiyle eşleşmiyor


584

Aşağıdaki Python kodunu derlediğimde,

IndentationError: unindent, herhangi bir dış girinti seviyesiyle eşleşmiyor


import sys

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

Neden?


7
ve muhtemelen n (1, n + 1) aralığı daha iyi olacaktır, eğer hesaplamalarınıza 'n' eklemek istiyorsanız :-)
Abgan

7
Aynı hata vardı, ancak bir yöntem girinti oldu yol yukarı altındaki bu hata verdi sola, biraz kod sonraki ondan sonra yöntemle. Bu nedenle bu hata sadece sekmeleri ve boşlukları karıştırmaktan kaynaklanamaz.
Prof. Falken sözleşmesi

14
Sublime Text 3 kullanıyorum. Bir Django projem var. Ben kullanarak hata giderildiView > Indentation > Intent Using Spaces
AbhimanyuAryan

Pycharm'da bu sorun olsaydı, sekmeleri ayarlama ve yapılandırmalardaki boşluk işe yaramadı. Sorun pycharm yapılandırmasını geçersiz kılan bir ~ / .editorconfig dosyası vardı.
Ken Myers

IDLE kullanmak, girinti sorunlarını bulmayı çok daha kolay hale getirdi. Çoğu düzenleyicinin bulamayacağı girinti hatalarını açıkça bulacaktır.
Dennis Gathagu

Yanıtlar:


668

Diğer posterler muhtemelen doğrudur ... sekmelerinizle karıştırılmış boşluklar olabilir. Tüm sekmeleri birkaç boşlukla değiştirmek için arama ve değiştirme yapmayı deneyin.

Bunu dene:

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
evet, gerçekten son iki satırda iç döngü kısmı üzerinde boşluk bırakmalıydım (sadece SO'da). Emin değilim neden ...
cbrulak

3
ilk satırım, "sonuç = 0" (1 olması gerekirdi, düzelttiğiniz için teşekkürler), geri kalanı sekmeli iken, darn,
python'un

1
Evet, bu zor olabilir. Python düzenlemek için emacs kullanın ve ben bu sorun yok bu yüzden her zaman py dosyaları boşluklarla sekmeleri değiştirmek için kurulum var. Notepad ++ bunun gibi bir seçeneğe de sahip olabilir.
Kevin Tighe

3
Aynı sorunu atm var :). SublimeText boşlukları nokta olarak gösterir, oldukça kullanışlıdır.
Kris

Boşlukları VEYA sekmeleri ile girintili yapabilirsiniz. sadece tutarlı olmanız mı gerekiyor? patlama kafa
David

265

ÖNEMLİ : Alanlar tercih edilen yöntemdir - bkz. PEP008 Girinti ve Sekmeler veya Alanlar? . (Bunun için @Siha'ya teşekkürler.)

İçin Sublime Textkullanıcılar:

Sublime TextGirinti için sekmeleri kullanmak üzere ayarlayın : View-> Indentation->Convert Indentation to Tabs

Indent Using SpacesYukarıdaki aynı alt menüdeki seçeneğin de işaretini kaldırın . Bu derhal bu sorunu çözecektir.


1
Ayrıca Python'u her kullandığınızda, hangi IDE / Metin Düzenleyicisini kullanırsanız kullanın benzer bir seçenek belirlediğinizden emin olun
activatedgeek

20
Ayrıca ATOM, Paketler> Boşluk> Boşlukları Sekmelere Dönüştür ve Python'un Sözdizimi Hatası Baş Ağrısından kaçınacaksınız!
loretoparisi

1
Boşluklar tercih edilen yöntemdir - bkz. PEP008 Girinti ve Sekmeler veya Boşluklar? . Sublime, bu şekilde yapmak için de ayarlanabilir.
SiHa

13
boşlukların tercih edilen yöntem olduğunu söylüyorsunuz, ancak yanıtınız insanlardan sekmeler kullanmak için yüce bir şey istemesini istiyor! Kafam karıştı
gota

@NunoCalaim Ne yazık ki, bu soruya cevap verdikten sonra oldu. Yeni bir projeye başlıyorsanız, lütfen tercih edilen mekan tekniğini kullanın. Bu yüzden cesur bir düzenleme yaptım, böylece yeni gelenler feragatnamenin farkında.
activatedgeek

137

Sekmeler / boşluklarla ilgili sorunları kolayca kontrol etmek için bunu yapabilirsiniz:

python -m tabnanny yourfile.py

ya da elbette editörünüzü doğru şekilde kurabilirsiniz :-)


1
Bu bazı sekme / boşluk girintisi hatası olan bir dosyada denedim, ancak hiçbir çıkış yanlış bir sekme dosyası ile hiç. Herhangi bir fikir?
Luchux

1
Boşluklarla ilgili bir sorunum vardı ve hata 191 satırında olduğunu söyledi, ancak tabnanny sayesinde gerçek sorunun o satırda değil, yukarıdaki satırda olduğunu gördüm.
'19

Teşekkür ederim! Ne harika bir ipucu. Hata VS Code'da flake8 tarafından tanımlandı, ancak sorunun nerede olduğunu belirleyemedi - tabnanny mikrosaniyede yaptı.
Steve

39

Girintili beyaz alanınızdaki sekmeleri ve boşlukları karıştırmadığınızdan emin misiniz? (Bu hataya neden olur.)

Not, Python kodunda sekmeler kullanmamanız önerilir. Stil kılavuzuna bakın . Notepad ++ 'ı sekmeler için boşluklar ekleyecek şekilde yapılandırmalısınız.


Kafam karıştı. Yukarıdaki yanıt, boşluklar yerine sekmeleri kullanmak üzere bir metin düzenleyici seçeneğini değiştirmeyi belirtir.
spurra

3
@BananaCode SADECE sekmeleri veya SADECE boşlukları kullandığınız sürece, teknik olarak hangisini seçtiğiniz önemli değildir. Python için boşluklar tercih edilmesine rağmen, bahsettiğim bağlantıya bakın.
zdan

21

Bu hatayla karşılaştığımda, bunun nedeni bir şekilde düzenleyicimdeki sekmeleri ve boşlukları karıştırdım.


13

Python'un IDLE düzenleyicisini kullanıyorsanız, benzer hata mesajlarından birinde önerildiği gibi yapabilirsiniz:

1) tümünü seçin, örn. Ctrl+A

2) Biçime Git -> Bölgeyi Untabify

3) Girintinizin hala doğru olup olmadığını iki kez kontrol edin, programınızı kaydedin ve tekrar çalıştırın.

Python 2.5.4 kullanıyorum


9

Vim kullanıyorsanız, escape tuşuna basın ve ardından şunu yazın

gg = G

Bu otomatik her şeyi girintili hale getirir ve içine attığınız boşlukları temizler.


8

Çizgi: result = result * igirintili olmalıdır (for-loop'un gövdesidir).

Veya - karışık boşluk ve sekme karakterleriniz var


Düzenlemeyi SO'da değiştirmek zorunda kaldım, garip.
Sorudaki

Tamam, bu yüzden cevabımın ikinci satırının doğru olduğuna inanıyorum - karışık alan ve sekme karakterleriniz var (sırasıyla ASCII'de 32 ve 8)
Abgan

5

Atom Üzerinde

git

Packages > Whitespace > Convert Spaces to Tabs

Ardından dosya girintinizi tekrar kontrol edin:

python -m tabnanny yourFile.py

veya

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

4

Bir girinti sorunu gibi görünüyor. Sen Python süslü parantez eşleşmesi gerekmez ama do girinti düzeylerini eşleşmesi gerekir.

Boşluk / sekme sorunlarını önlemenin en iyi yolu, metin düzenleyicinizde görünmez karakterler görüntülemektir. Bu, girintiyle ilgili hataları önlemenin ve / veya çözmenin hızlı bir yolunu verecektir.

Ayrıca, kopyalanmış kodun enjekte edilmesi bu tür bir sorun için ortak bir kaynaktır.


4

Notepad ++ kullanıyorsanız, \ t öğesini bulmak ve dört boşlukla değiştirmek için genişletilmiş arama moduyla "değiştir" yapın.


2

Atom Kullanıcıları için Packages ->whitspace -> remove trailing whitespaces bu benim için çalıştı


2

Sadece bir ek. Notepad ++ her iki girinti ile benzer bir sorun vardı.

  1. Kabul edilmeyen girinti
  2. Dış Girinti Seviyesi

    ----> sekmesini Arama ----> musluk üzerinde gidin değiştirin ----> radyo düğmesine basın Genişletilmiş > Şimdi dört boşluklu \ t yerine --- aşağıda

    ----> sekmesini Arama ----> musluk üzerinde gidin değiştirin ----> radyo düğmesine basın Extended aşağıda ---> Şimdi n hiçbir şey \ değiştirin


2

Jupyter dizüstü bilgisayar kullanıyordum ve yukarıdaki çözümlerin neredeyse tamamını (senaryomuza uyarlayarak) kullanmamaya çalıştım. Daha sonra satır satır gittim, her satır için tüm boşlukları sildim ve sekme ile değiştirdim. Bu sorunu çözdü.


2

Spyder kullanıcıları için sorunu hemen düzeltmek için Kaynak> Girinti Düzeltme seçeneğine gidin.


1

Bunun nedeni, yukarıdaki fonksiyonun aynı şekilde girintili olmaması olabilir. yani

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

1

Dün aynı sorunu yaşadım, girinti hatası, yüce metin editörü kullanıyordum. düzeltmeye çalışırken saatlerimi aldı ve sonunda kodu VI metin editörüne kopyalayarak sona erdi ve sadece iyi çalıştı. ps python boşluklara çok duyarlıdır, boşluk ile sekmeyi karıştırmamaya dikkat edin.


1

Hiçbir cevap özgü ne var ki farkında beri spyderTemelde, dikkatle bakmak: ben bir ekleyeceğiz iftablosu ve emin tüm yapmak if, elifve elseonlar şöyle başında aynı çizgide olduğun aynı şekilde boşluk:

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

Tanımlı bir işlevim vardı, ancak işlev yorumlarının dışında herhangi bir içerik yoktu ...

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

Bağırdı:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

( ^işaretin işaret ettiği çizginin boş olduğunu unutmayın )

-

Çoklu çözümler:

1: Sadece işlevi yorumlayın

2: İşlev yorumu ekleyin

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

3: Hiçbir şey yapmayan satır ekle

def foo(bar):
    0

Her durumda, bunun neden boş bir işlev olduğunu açıkça belirttiğinizden emin olun - kendiniz veya kodunuzu kullanacak olan akranlarınız için


Pass cümlesi yararlı olabilir orada :)
KevinG

1

İlk olarak, sadece mantıksal bir hata olduğunu hatırlatmak için sonuç = 1'i saklamanız daha iyi olur, yoksa döngü çalıştıktan sonra bile çıktınız sonuç = 0 olur.

İkinci olarak şöyle yazabilirsiniz:

import sys

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

  print "factorial is ",result
  return result

Bir satır bırakmak, python kabuğuna FOR ifadelerinin sona erdiğini söyleyecektir. Python kabuğunu kullanma deneyiminiz varsa, neden bir satır bırakmamız gerektiğini anlayabilirsiniz.


1

Değeri için, doktorum çok fazla girintili ve bu da aynı hatayı atıyor

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

IndentationError: unindent does not match any outer indentation level


bu sorunumu çözdü
bhordupur

0

Bunun nedeni, hem sekmelerin hem de boşlukların bir karışımı olmasıdır. Tüm boşlukları kaldırabilir ve sekmelerle değiştirebilirsiniz.

Veya şunu yazmayı deneyin:

#!/usr/bin/python -tt

kodun başında. Bu satır, sekmeler ve boşluklar arasındaki farkları giderir.


0

benim durumumda, sorun Eclipse üzerinde pydev yapılandırmasıydı

Tutulma


0

Komodo editörünü kullanıyorsanız, benzer hata mesajlarından birinde önerildiği gibi yapabilirsiniz:

1) tümünü seç, örneğin Ctrl + A

2) Kod -> Bölgeyi Untabify'a gidin

3) Girintinizin hala doğru olup olmadığını iki kez kontrol edin, programınızı kaydedin ve tekrar çalıştırın.

Python 3.4.2 kullanıyorum


0

Python geliştirme için Sublime metni kullanıyorsanız, Anaconda paketini kullanarak hatayı önleyebilirsiniz.

  1. dosyanızı yüce olarak açın
  2. açık alanlara sağ tıklayın
  3. anaconda'yı seç
  4. otomatik forma tıklayın
  5. YAPILDI Veya CTRL + ALT + R tuşlarına basın.

0

Python eklentisine sahip intellij'de, belgeyi yeniden biçimlendirmek için Ctrl + Shift + Alt, girinti / sekme / boşluklar sorununu çözdü


0

İçin SPYDER kullanıcıları: Python 3.7.1 ile spyder 3.3.2 kullanıyorum ve aşağıdaki adımlara, kullanım sekmelerine girinti ayarı, bu çözülmesi, tıklayın:

  • Araçlar.
  • Tercihler.
  • Editör.
  • Gelişmiş Ayarlar.
  • Girinti karakterleri -> Sekmeler.

Sonra sekme tuşunu kullanarak "tanımlanamayan" satırı sıfırladım.

Nedense, bu ayar olmadan, bazen Hayalet IndentationError aldım .


0

Örneğin:

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

Bu kodda benim için aynı durum oluştu. Satır 2 ve 3'ün önceki girinti boşluklarını silin ve ardından sekme veya boşluk kullanın. Asla ikisini de kullanmayın . Python'a kod yazarken uygun girinti verin. Spyder için Kaynak> Girinti Düzelt'e gidin. Aynı şey VC Kodu ve yüce metin veya başka bir düzenleyici için de geçerlidir. Girintiyi düzeltin.


-6

Bu esas olarak editör nedeniyle olur. Sekmeleri boşluklara değiştirmeyi deneyin (4) .en iyi python dostu IDE veya Editörler linux için pycharm, sublime, vim.
hatta ben de aynı sorunla karşılaşmış, daha sonra bir kodlama sorunu olduğunu buldum. u çok ur editörü değiştirmek öneririz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.