2013-04-08 12 views
5

görmek için bugün şaşırdı ki (Python 2.7.3 en azından), istisnasız aşağıdaki çalışır:"Dışarıda" tanımlanmamış bir ad neden NameError'ı yükseltmiyor?

>>> try: 
...  pass 
... except ThingThatDoesNotExist: 
...  print "bad" 
... 
>>> 

Bunu, REPL içinde nasıl benzer bir NameError yükseltmek gerektiğini sanırdım izleyen:

>>> x = ThingThatDoesNotExist 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'ThingThatDoesNotExist' is not defined 

Burada neler olup bittiği hakkında bir fikrin var mı?

+2

Testiniz hiçbir şey yapmaya kalkmaz ve bu nedenle geçer. Bu yana, hiçbir zaman istisna dışında koşmaz. Yanılıyor olabilirim, fakat Python tanımlanana kadar tanımlanmamış değişkenleri dikkate almıyor mu? –

+1

Tam olarak burada neler oluyor. Python, bu adın gerekene kadar herhangi bir şeye bağlı olup olmadığını kontrol etmez. – geoffspear

+1

Yup. Sadece 'pass' değerini 'ValueError'ı yükseltmek' veya 'NameError' değerini alırsınız. – kwatford

cevap

4

bu durum yükseltmenizi değil aynı nedeni:

>>> True or ThingThatDoesNotExist 

Python tam olarak değerlendirilmesi gereken anı adlarını arar. Değerlendirilmesine gerek olmayan isimler araştırılmıyor ve istisnayı arttıran başarısız arama.

+0

Geriye doğru bakıldığında - evet, bu mükemmel bir anlam ifade ediyor. Sanırım bu noktada yeteri kadar kahve içmiyorum :) – dcrosta

İlgili konular