2017-08-09 117 views
7

Aşağıdaki program neden SyntaxError yerine IndentationError yükseltiliyor?Neden bir ıntansıreror burada bir SyntaxError yerine yükseltiliyor?

>>> if True: 
... print "just right!" 
    File "<stdin>", line 2 
    print "just right!" 
     ^
IndentationError: Missing parentheses in call to 'print' 

IDLE'nin yalnızca komik davranmadığından emin olmak için, bu kodu normal bir kaynak dosyadan çalıştırarak da test ettim. Aynı istisna türü hala yükseltiliyor. Bunu test etmek için kullanılan Python versiyonları Python 3.5.2 ve Python 3.6.1 idi.

Bu, print kullanırken eksik olan parantezin SyntaxError, IndentationError değil olarak kabul edildiğidir.

“SyntaxError: Missing parentheses in call to 'print'” is a new error message that was added in Python 3.4.2 primarily to help users that are trying to follow a Python 2 tutorial while running Python 3.

Bu bir hata mı: yazı What does “SyntaxError: Missing parentheses in call to 'print'” mean in Python? üst cevabı da bunu desteklemek için görünüyor? Eğer öyleyse, buna neden olan nedir?

cevap

8

IndentationError, SyntaxError'un bir alt sınıfıdır, bu yüzden teknik açıdan bu , bir sözdizimi hatasıdır.

iki hatalarınız var. Girintinin her ikisi de ve parantezleri eksik. Bu biraz bir hata, print özel durum algılandığında SyntaxError iletisini değiştiren kod var ve bu kod hala SyntaxError alt sınıfları için geçerlidir (SyntaxError özel durum yapıcısında uygulanır).

Sen TabError istisna için aynı hatayı tetikleyebilir:

>>> compile('if 1:\n 1\n\tprint "Look ma, tabs!"', '', 'single') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "", line 3 
    print "Look ma, tabs!" 
         ^
TabError: Missing parentheses in call to 'print' 

SyntaxError codepath exec() ve print() kenar-durumlarda kontrol gereken bu sadece kafa karıştırıcı olarak fiili SyntaxError durumlarda değil, alt sınıfları için gerçekten sadece yangın .

Bunu izlemek için issue 31161 başvurdum.

+0

Yani bunun amaçlanmış davranış olduğunu mu söylüyorsunuz? –

+0

@ChristianDean: Tam olarak değil, bunun bir hata olarak dosyalandığını göreceğim. –

+0

_ "Burada iki hata var." _ - Ama burada iki hataya sahip olsaydım, Python genellikle "Yukarıdaki istisnayı ele alırken başka bir istisna oluştu" gibi bir şey söylemez mi? –