Python try… virgül vs 'as' hariç


246

Dış ifadelerde ',' ve 'as' arasındaki fark nedir, örneğin:

try:
    pass
except Exception, exception:
    pass

ve:

try:
    pass
except Exception as exception:
    pass

İkinci sözdizimi 2.6'da yasal mı? Windows'ta CPython 2.6'da çalışır, ancak cygwin'deki 2.5 yorumlayıcı geçersiz olduğundan şikayet eder.

Her ikisi de 2.6'da geçerliyse hangisini kullanmalıyım?

Yanıtlar:


284

Kesin belge PEP-3110: İstisnaları Yakalama

Özet:

  • Python 3.x yılında kullanarak asedilir gerekli bir değişkene bir istisna atamak.
  • Python 2.6+ sürümünde assözdizimini kullanın, çünkü Python 3.x ile çok daha az belirsiz ve ileri uyumludur.
  • Python 2.5 ve önceki sürümlerinde, asdesteklenmediğinden virgül sürümünü kullanın .

16
Kullanma astek yolu Python 3.x yerel istisna atamak Ancak gereklias değildir , çünkü hiç ihtiyacınız yoksa belirtmeniz gerekmez.
mercator

38

Evet yasal. Python 2.6 kullanıyorum

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo

Güncelleme : asSözdizimini kullanmanın başka bir nedeni daha var . Kullanmak ,, diğerlerinin de işaret ettiği gibi, işleri çok daha belirsiz kılar; ve fark yaratan şey bu. Python 2.6 itibariyle orada multicatchbağlanmanızı sağlar bir exceptblokta birden fazla istisna yakalamanızı . Böyle bir durumda, söylemek daha etkileyici ve pitoniktir

except (exception1, exception2) as e

söylemek yerine

except (exception1, exception2), e

hangisi hala işe yarar


13
2.6'dan önceki Python sürümleri, çoklu istisna türlerini yakalamak için bir demet kullanmanıza izin verdi. Ancak sözdizimi kafa karıştırıcıydı; except NameError, ValueError:daha sonra ValueErroristisnanın neden hiç yakalanmadığını merak edersiniz . Veya kullanılmış except (NameError, e):ve bir NameErrorfor ile kaldı 'e'!
Martijn Pieters

17

ileriye dönük "sözdizimi" tercih edilir, ancak kodunuzun eski Python sürümleriyle (2.6 yeni sürümü destekleyen ilk sürüm) çalışması gerekiyorsa, virgül sözdizimini kullanmanız gerekir.


9

Tüm python sürümlerini desteklemek istiyorsanız, sys.exc_info()işlevi aşağıdaki gibi kullanabilirsiniz :

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])

(kaynak: http://python3porting.com/noconv.html )


2
Not: Burada dikkat edilmesi gereken bazı köşe durumlar vardır. Py3'te, ashedef (istisna bilgilerinin geri kalanıyla birlikte), delsiz exceptbloktan çıkar çıkmaz dolaylı olarak düzenlenir (bu, saklanan izlemede yer alan bazı döngüsel referansların, döngüsel GC çalışmaya başlayana kadar bellek bırakmasını geciktirmesini önler ). Bu nedenle try/finally, exceptbloktan del eçıkmadan önce bir blok kullanmadan emin olmadığınız sürece bu eşdeğer kod biraz daha az eşdeğerdir except.
ShadowRanger

0

Python 3.7'den itibaren (diğer sürümlerden emin değilim) 'virgül' sözdizimi artık desteklenmiyor:

Kaynak dosya exception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
  • $ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
  • $ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax
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.