"İstisnayı yükselt ()" ve "istisnayı yükselt" arasında parantez olmadan bir fark var mı?


100

Parametresiz bir istisna tanımlama:

class MyException(Exception):
    pass

Yükseltildiğinde, aşağıdakiler arasında herhangi bir fark var mı:

raise MyException

ve

raise MyException()

Ben bulamadım; bu sadece aşırı yüklenmiş bir sözdizimi mi?



1
Kesinlikle sözdizimsel değildir. Python, çalışma zamanına kadar bir sınıf mı yoksa bir örnek mi alacağını bilemez.
asmeurer

Yanıtlar:


116

Kısa cevap hem olmasıdır raise MyExceptionve raise MyException()aynı şeyi yapın. Bu ilk biçim, istisnanızı otomatik olarak somutlaştırır.

Dokümanlardan ilgili bölüm "diyor zam istisna nesnesi olarak ilk ifadeyi değerlendirir. Bu bir alt sınıf veya BaseException bir örneği ya olmalıdır. Bir sınıf ise bulunduğu sınıfı nesnelleştirilmesiyle gerektiğinde, istisna örneği elde edilecektir tartışma yok. "

Bununla birlikte, anlambilim aynı olsa bile, ilk biçim mikroskobik olarak daha hızlıdır ve ikinci biçim daha esnektir (çünkü gerekirse ona argümanlar iletebilirsiniz).

Çoğu kişinin Python'da (yani standart kitaplıkta, popüler uygulamalarda ve birçok kitapta) kullandığı genel stil raise MyException, hiçbir argüman olmadığında kullanmaktır . İnsanlar istisnayı yalnızca bazı argümanların iletilmesi gerektiğinde doğrudan somutlaştırır. Örneğin: raise KeyError(badkey).


19
Neden ilk form (parantezsiz) mikroskobik olarak daha hızlı olsun?
jamesdlin

16
@jamesdlin Çünkü otomatik olarak başlatılacak C kodu, aramayı kendiniz yapmanızdan gelen yorumlanmış ek yüke sahip değildir.
Raymond Hettinger


0

Evet, ValueErrorve arasında bir fark varValueError()

ValueErrorbir sınıftır, oysa bir sınıfın ValueError()bir örneğini oluşturur. Bu nedendir type(ValueError) is typevetype(ValueError()) is ValueError

Tek amacı raiseistisnayı yükseltmektir,

kullandığımızda ValueError, sınıf çağrılacak ve bu da yapıcıyı çalıştıracak ValueError()

kullandığımız zaman ValueError(), yöntem ValueError()doğrudan çağrılır.

Not: raise ValueError # shorthand for 'raise ValueError()'

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.