Python'da "Beklenmedik girinti" ile ne yapmalı?


117

Python'daki "beklenmeyen girinti" hatasını nasıl düzeltirim?


4
Hatayı üreten bir kod parçası, sorununuzu daha iyi anlamamıza yardımcı olacaktır. Lütfen sorunuzu biraz kod içerecek şekilde düzenleyin.
RBerteig

7
Bu bana bir boşluk sorunu gibi geliyor, bu yüzden bir kod örneği işe yaramaz.
James McMahon

Belirsiz soru ve seçili cevap yok.
rafael.js

"Hatayı nasıl düzeltirim ..."? Nerede oluştuğunu belirleyerek ve hatanın nedenini düzelterek. Bu durumda, belirli bir çizginin girintisini Python'un beklediği gibi
göstererek

Yanıtlar:


132

Python, kod bloklarının ne zaman başlayıp biteceğini belirlemek için satırın başında boşluk kullanır. Alabileceğiniz hatalar:

Beklenmeyen girinti. Bu kod satırının başlangıcında öncekinden daha fazla boşluk vardır, ancak öncekisi bir alt bloğun başlangıcı değildir (örn. İf / while / for ifadesi). Bir bloktaki tüm kod satırları tam olarak aynı boşluk dizisiyle başlamalıdır. Örneğin:

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

Bu özellikle etkileşimli olarak python çalıştırırken yaygındır: komutlarınızdan önce fazladan boşluk bırakmadığınızdan emin olun. (Örnek kodu kopyalayıp yapıştırırken çok can sıkıcı!)

>>>   print "hello"
IndentationError: unexpected indent

Girintiyi kaldırma, herhangi bir dış girinti düzeyiyle eşleşmez. Bu kod satırı, başlangıçta öncekinden daha az boşluk içerir, ancak aynı şekilde parçası olabileceği başka herhangi bir blokla eşleşmez. Python nereye gideceğine karar veremez. Örneğin, aşağıda, son baskının if cümlesinin bir parçası olması gerekiyor mu, değil mi?

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

Girintili bir blok bekleniyordu. Bu kod satırı, başlangıçta öncekiyle aynı sayıda boşluğa sahiptir, ancak son satırın bir blok başlatması bekleniyordu (örn. İf / while / for ifadesi, işlev tanımı).

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

Hiçbir şey yapmayan bir işlev istiyorsanız, "işlemsiz" komut geçişini kullanın :

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

Sekmeleri ve boşlukları karıştırmaya izin verilir (en azından benim Python sürümümde), ancak Python sekmelerin 8 karakter uzunluğunda olduğunu varsayar ve bu, düzenleyicinizle eşleşmeyebilir. Sekmelere "hayır" demeniz yeterli. Çoğu editör, bunların otomatik olarak boşluklarla değiştirilmesine izin verir.

Bu sorunları önlemenin en iyi yolu, bir alt bloğa girinti yaparken daima tutarlı sayıda boşluk kullanmak ve ideal olarak sorunu sizin için çözen iyi bir IDE kullanmaktır. Bu aynı zamanda kodunuzu daha okunaklı hale getirecektir.


7
iyi açıklama. Bunun yanı sıra, NotePad ++ 'da boşlukları' sekme 've' boşluk çubuğu 'ile karıştırdığında,' boşluklar 'yerine' sekmeyi 'değiştirdiğinde Beklenmeyen girinti hatası da harcadım.
José Rosas Sáenz

2
@ JoséRosasSáenz Yorumunuz beni çok fazla sorundan kurtardı
user3726345

Ek bir neden, cümlenin exceptbir kısmını eksiktir try. Kod doğru görünür (girintisiz satırın trybloğun dışında olması amaçlanmıştır ) ancak Python bunu 'beklenmedik girinti' hatası olarak bildirir. Bu sorun except, belki pass( burada olduğu gibi )
dumbledad

@dumbledad Hangi python sürümünü görüyorsunuz? Benimkini denediğimde (hem 2.7.15 hem de 3.6.8), bir SyntaxError alıyorum
Alice Purcell

Bir web sitesinden kodu kopyalarken / yapıştırırken bu hatayla karşılaştım. Konumlandırma iyi görünüyordu ancak QGIS (3.10) kodu çalıştırmadan önce beyaz alanı kaldırmam ve boşlukları kullanarak yeniden uygulamam gerekiyordu.
benj

23

Python'da boşluk çok önemlidir, bu da kod bloklarınızın yapısını verir. Bu hata, kod yapınızı şu şekilde bozduğunuzda ortaya çıkar:

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

Dosyanızda çeşitli sekmeler ve boşluklar da olabilir.

PyScripter veya Netbeans gibi python sözdizimine duyarlı bir düzenleyici kullanmanızı öneririm


1
Evet, kesinlikle python bilincine sahip düzenleyiciler kullanın! Varsayılan ayarlarla notepad ++ 'da düzenleme yaparken bir sorun yaşadım ve beyaz boşluğu yanlış alıyordu
Dave Archer

2
karışık sekmeler ve boşluklar "SyntaxError: girintide sekmelerin ve boşlukların tutarsız kullanımı"
ifadesini yükseltir

Bir uyarı olarak, Python Netbeans eklentisi şu anda sekmeleri mevcut koddan boşluklara dönüştürmüyor. Ancak, yeni kod yazarken bunu yapacaktır.
James McMahon

PyCharm bunu tutarlı bir şekilde dönüştürebilir. Ayrıca "hatalı" olan satırları da vurgulayacaktır. Alıntıları kullanıyorum çünkü bu 1960'lar değil ve Python gibi harika bir dilin hala bu beyin ölümü, zaman kaybettiren kusura sahip olduğuna inanamıyorum.
Echelon

Kodumu yazarken yanlışlıkla düzenleyiciler arasında geçiş yaptım ve bu yeni koddaki girintilerimi doldurdu. Değişiklik göze çarpmıyordu, ancak yorumlayıcı kodumu çalıştırmadı. Bu gönderi sorunu bulmama yardımcı oldu.
Lucien Stals

21

Sekmeleri ve boşlukları tutarsız kullanıp kullanmadığınızı öğrenmek için kodunuzu -tt seçeneğiyle çalıştırın


16

Kullandığınız düzenleyicide görünür beyaz alanı açın ve sekmeleri boşluklarla değiştir seçeneğini açın.

Sekmeleri Python karıştırma sekmeleri ile kullanabilirsiniz ve boşluk genellikle yaşadığınız hataya yol açar. Sekmeleri 4 boşlukla değiştirmek, Python kodu yazmak için önerilen yaklaşımdır.


1
Bunu özellikle nasıl yaparsınız? Sublime kullanıyorum.
chibole

8

Doğru girintiyi kullanarak. Python boşluk farkındadır, bu nedenle bloklar için girinti kılavuzlarını izlemeniz gerekir, aksi takdirde girinti hataları alırsınız.


6

Sublime kullanarak Python yazıyorsanız ve girinti hataları alıyorsanız,

görünüm -> girinti -> girintiyi boşluklara dönüştür

Açıkladığım sorun Sublime metin düzenleyicisinden kaynaklanıyor. Aynı sorun diğer editörlerden de kaynaklanıyor olabilir. Esasen, mesele, girintileri sekmeler açısından kodlayan çeşitli editörlere karşı boşluklar açısından girintileri ele almak isteyen Python ile ilgilidir.


oh ... peki buna yüce neden oluyor?
nitin

Evet, anlattığım sorunun nedeni Sublime. Diğer editörlerden de kaynaklanıyor olabilir. Esasen, mesele, girintileri sekmeler açısından kodlayan çeşitli editörlere karşı boşluklar açısından girintileri ele almak isteyen Python ile ilgilidir.
Puneet Lamba

Notepad ++ ile aynı sorunu yaşadım. Gözleri doğru bulan şey, bu yüzden bunu çözmesi zaman aldı. Düzenleyicinin bazı beyaz boşlukları sekmelere dönüştürdüğünü anlamak için imleci her seferinde bir karakter hareket ettirmek zorunda kaldım
Bharat Anand

4

Düzenleyicinizde "sekme yerine boşluk ekle" seçeneğini kullandığınızdan emin olun. Daha sonra, örneğin 4'lük bir sekme genişliği istediğinizi seçebilirsiniz. Bu seçenekleri gedit'te düzenle -> tercihler -> düzenleyici altında bulabilirsiniz.

alt satır: Boşlukları sekme değil KULLANIN


Alt satırınız hile yaptı!
Nick Div

3

Bu hata, Python yorumlayıcısına (terminal / konsol) bir şey yapıştırırken de ortaya çıkabilir.

Yorumlayıcının boş bir satırı bir ifadenin sonu olarak yorumladığına dikkat edin, bu nedenle

def my_function():
    x = 3

    y = 7

yorumlayıcı önceki boş satırı y = 7ifadenin sonu olarak yorumlayacaktır , yani işlevinizi tanımlamayı bitirmişsinizdir ve sonraki satır - y = 7yeni bir ifade olduğu için yanlış girintiye sahip olacaktır.


Anahtar olmak fonksiyonu tanımı içindeki boş satır ince, bu ancak Python fonksiyon sonunda herhangi bir boş satır yorumlar çünkü hala başlangıç boşluk olmalıdır
MichaelChirico

3

Belirtilmemiş gibi görünen bir sorun, bu hatanın, girintiyle ilgisi olmayan koddaki bir sorun nedeniyle ortaya çıkabilmesidir.

Örneğin, aşağıdaki komut dosyasını alın:

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

Bu IndentationError: unexpected unindent, sorun elbette eksik bir except:ifade olduğunda bir döndürür .

Demek istediğim: Beklenmeyen (un) girintinin bildirildiği yukarıdaki kodu kontrol edin!


2

Girinti düzgün görünüyorsa, editörünüzde "Beyaz Boşluğu Görüntüle" seçeneği olup olmadığına bakın. Bunu etkinleştirmek, boşlukların ve sekmelerin nerede karıştırıldığını bulmaya izin vermelidir.


2

Benim için her zaman işe yarayan bir numara var:

Eğer beklenmedik bir girinti varsa ve tüm kodun mükemmel bir şekilde girintili olduğunu görürseniz, onu başka bir düzenleyiciyle açmayı deneyin ve hangi kod satırının girintili olmadığını göreceksiniz.

Vim, gedit veya bunun gibi editörler kullanıldığında bana oldu.

Kodunuz için yalnızca 1 düzenleyici kullanmayı deneyin.


2

Komut dosyanızı kopyalayın ve "" "kodunuzun tamamını" "" altına koyun ...

bu satırı bir değişkende belirtin .. gibi,

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

şimdi bu kodu Sublime Editor'da ctrl + b kullanarak çalıştırın, şimdi konsolda girintili kod yazdıracaktır. bu kadar


kodumu nasıl çalıştıracağım. "" "Ve" "" yazısını kaldırmam ve a.replace yazdırmam ve normal şekilde çalıştırmam gerekecek mi?
chibole

hiçbir "" "" "" (üç tırnak) içeriğinize dizeden ziyade atıfta bulunur. kodunuz tek / çift tırnak içeren dizeler içerebileceği için gereklidir, bu nedenle "" "gereklidir.
Mohideen bin Mohammed

2

Yapmanız gereken tek şey, aşağıdaki kodların başından itibaren boşlukları veya sekme boşluklarını kaldırmaktır.

from django.contrib import admin

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

2

Çözmek için aşağıdaki komutu çalıştırın:

autopep8 -i <filename>.py

Bu, kodunuzu güncelleyecek ve tüm girinti hatalarını çözecektir :)

Umarım bu çözülür


Uygulaması çok kolay. Benim için her zaman işe yarar, bu yüzden paylaştığım birileri için faydalı olacağını umuyorum :)
Sharyar Vohra

1

Notepad ++, sekme alanını doğru veriyordu ancak girinti sorunu nihayet Sublime metin düzenleyicisinde bulundu.

Sublime metin düzenleyicisini kullanın ve satır satır gidin


0

Python'da girinti önemlidir ve bu, diğer birçok programlama dilinin aksine, kod okunabilirliği için değildir. Kodunuzda ardışık komutlar arasında herhangi bir beyaz boşluk veya sekme varsa, Python bu hatayı verecektir çünkü Python buna duyarlıdır. Herhangi bir Python'a kod kopyalayıp yapıştırdığımızda bu hatayı almamız muhtemeldir. Notepad ++ gibi bir metin düzenleyici kullanarak bu boşlukları belirlediğinizden ve kaldırdığınızdan emin olun veya hata aldığınız kod satırındaki beyaz boşluğu manuel olarak kaldırın.

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

Teşekkürler!

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.