क्या एक कोशिश में / एक ही लाइन को छोड़कर, अजगर में एक तरीका है?
कुछ इस तरह...
b = 'some variable'
a = c | b #try statement goes here
जहां b
एक घोषित चर है और c
नहीं है ... इसलिए c
एक त्रुटि फेंक a
देगा और बन जाएगा b
...
जवाबों:
पायथन में एक लाइन पर try
/ except
ब्लॉक को संपीड़ित करने का कोई तरीका नहीं है ।
साथ ही, यह जानना गलत है कि पायथन में एक चर मौजूद है, जैसे कि आप कुछ अन्य गतिशील भाषाओं में हैं। सुरक्षित तरीका (और प्रचलित शैली) सभी चर को किसी चीज़ में सेट करना है। यदि वे सेट नहीं हो सकते हैं, तो उन्हें None
पहले ( 0
या ''
या कुछ और अगर यह अधिक लागू होता है) पर सेट करें ।
यदि आप उन सभी नामों को असाइन करते हैं जिन्हें आप पहले रुचि रखते हैं, तो आपके पास विकल्प हैं।
सबसे अच्छा विकल्प एक बयान है।
c = None
b = [1, 2]
if c is None:
a = b
else:
a = c
वन-लाइनर विकल्प एक सशर्त अभिव्यक्ति है।
c = None
b = [1, 2]
a = c if c is not None else b
कुछ लोग ऐसा करने के लिए शॉर्ट-सर्किटिंग व्यवहार का दुरुपयोग or
करते हैं। यह त्रुटि प्रवण है, इसलिए मैं इसका उपयोग कभी नहीं करता।
c = None
b = [1, 2]
a = c or b
निम्नलिखित मामले पर विचार करें:
c = []
b = [1, 2]
a = c or b
इस मामले में, a
शायद होना चाहिए []
, लेकिन यह [1, 2]
इसलिए []
है क्योंकि एक बूलियन संदर्भ में गलत है। क्योंकि बहुत सारे मूल्य हैं जो झूठे हो सकते हैं, मैं or
चाल का उपयोग नहीं करता हूं । (यह वही समस्या है जो लोग तब कहते हैं, if foo:
जब वे कहते हैं कि भाग जाते हैं if foo is not None:
।)
try
/ except
ब्लॉक के लिए कोई एक-पंक्ति वाक्यविन्यास नहीं है । सौभाग्य से लाइनें सस्ती हैं, इसलिए 4-लाइन समाधान आपके लिए काम करना चाहिए। ;-)
get
यदि आप अपवाद नहीं चाहते हैं तो उपयोग न करें । filter
इसके बजाय उपयोग करें ।
यह बहुत अधिक हैकिश है, लेकिन मैंने इसे प्रॉम्प्ट पर उपयोग किया है जब मैं डीबगिंग के लिए क्रियाओं का क्रम लिखना चाहता था:
exec "try: some_problematic_thing()\nexcept: problem=sys.exc_info()"
print "The problem is %s" % problem[1]
अधिकांश भाग के लिए, मैं नो-सिंगल-लाइन-ट्राइ-सिवाय प्रतिबंध से परेशान नहीं हूं, लेकिन जब मैं सिर्फ प्रयोग कर रहा हूं और मैं चाहता हूं कि इंटरएक्टिव दुभाषिया में एक ही बार में कोड का एक पूरा हिस्सा याद कर लें। कि मैं इसे किसी तरह समायोजित कर सकता हूं, यह छोटी सी चाल काम में आती है।
जिस वास्तविक उद्देश्य के लिए आप प्रयास कर रहे हैं, आप कोशिश कर सकते हैं locals().get('c', b)
; आदर्श रूप से स्थानीय संदर्भ के बजाय एक वास्तविक शब्दकोश का उपयोग करना बेहतर होगा, या जो भी हो सकता है, उसे सेट करने से पहले किसी को भी असाइन न करें।
problem[0]
क्या लौटाएगा जो फ़ंक्शन देता है?
Python3 में आप उपयोग कर सकते हैं contextlib.suppress :
from contextlib import suppress
d = {}
with suppress(KeyError): d['foo']
एक अन्य तरीका एक संदर्भ प्रबंधक को परिभाषित करना है:
class trialContextManager:
def __enter__(self): pass
def __exit__(self, *args): return True
trial = trialContextManager()
फिर with
एक एकल पंक्ति में त्रुटियों को अनदेखा करने के लिए कथन का उपयोग करें :
>>> with trial: a = 5 # will be executed normally
>>> with trial: a = 1 / 0 # will be not executed and no exception is raised
>>> print a
5
रनटाइम त्रुटि के मामले में कोई अपवाद नहीं उठाया जाएगा। यह try:
बिना के जैसा है except:
।
सीमित अपेक्षित अपवादों के साथ poke53280 उत्तर का संस्करण।
def try_or(func, default=None, expected_exc=(Exception,)):
try:
return func()
except expected_exc:
return default
और इसे इस्तेमाल किया जा सकता है
In [2]: try_or(lambda: 1/2, default=float('nan'))
Out[2]: 0.5
In [3]: try_or(lambda: 1/0, default=float('nan'), expected_exc=(ArithmeticError,))
Out[3]: nan
In [4]: try_or(lambda: "1"/0, default=float('nan'), expected_exc=(ArithmeticError,))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
[your traceback here]
TypeError: unsupported operand type(s) for /: 'str' and 'int'
In [5]: try_or(lambda: "1"/0, default=float('nan'), expected_exc=(ArithmeticError, TypeError))
Out[5]: nan
parse_float = lambda x, y=exec("def f(s):\n try:\n return float(s)\n except: return None"): f(x)
हमेशा एक समाधान होता है।
समस्या यह है कि इसका वास्तव में एक django model.objects.get क्वेरी मैं परीक्षण करने की कोशिश कर रहा हूं। कोई डेटा नहीं मिलने पर .get एक त्रुटि देता है ... यह कोई नहीं लौटाता (जो मुझे परेशान करता है)
कुछ इस तरह का उपयोग करें:
print("result:", try_or(lambda: model.objects.get(), '<n/a>'))
जहाँ try_or आपके द्वारा परिभाषित एक उपयोगिता फ़ंक्शन है:
def try_or(fn, default):
try:
return fn()
except:
return default
वैकल्पिक रूप से आप के लिए स्वीकार किए जाते हैं अपवाद प्रकार सीमित कर सकते हैं NameError
, AttributeError
आदि
कैसे दो लाइनों का उपयोग करने के बारे में। ठीक है न ?
>>> try: a = 3; b= 0; c = a / b
... except : print('not possible'); print('zero division error')
...
not possible
zero division error
आप का उपयोग कर नाम स्थान dict तक पहुंच कर यह कर सकते हैं vars()
, locals()
या globals()
जो भी अपनी स्थिति के लिए सबसे उपयुक्त है।
>>> b = 'some variable'
>>> a = vars().get('c', b)
पाइथन 3 पर काम करता है, जो वाल्टर मुंड से प्रेरित है
exec("try:some_problematic_thing()\nexcept:pass")
एक पंक्ति में mulitiples लाइनों के लिए
exec("try:\n\tprint('FirstLineOk')\n\tsome_problematic_thing()\n\tprint('ThirdLineNotTriggerd')\nexcept:pass")
Ps: आपके डेटा पर नियंत्रण नहीं करने के लिए Exec असुरक्षित है।
अगर आपको वास्तव में अपवादों को प्रबंधित करने की आवश्यकता है:
(poke53280 के उत्तर से संशोधित)
>>> def try_or(fn, exceptions: dict = {}):
try:
return fn()
except Exception as ei:
for e in ei.__class__.__mro__[:-1]:
if e in exceptions: return exceptions[e]()
else:
raise
>>> def context():
return 1 + None
>>> try_or( context, {TypeError: lambda: print('TypeError exception')} )
TypeError exception
>>>
ध्यान दें कि यदि अपवाद समर्थित नहीं है, तो यह अपेक्षित रूप से बढ़ेगा:
>>> try_or( context, {ValueError: lambda: print('ValueError exception')} )
Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
try_or( context, {ValueError: lambda: print('ValueError exception')} )
File "<pyshell#38>", line 3, in try_or
return fn()
File "<pyshell#56>", line 2, in context
return 1 + None
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
>>>
अगर Exception
दिया जाता है, तो यह नीचे कुछ भी मेल खाएगा।
( BaseException
यह अधिक है, इसलिए यह मेल नहीं खाएगा)
>>> try_or( context, {Exception: lambda: print('exception')} )
exception
यहां @surendra_ben द्वारा प्रदान किए गए उत्तर का एक सरल संस्करण है
a = "apple"
try: a.something_that_definitely_doesnt_exist
except: print("nope")
...
nope
with
एक पंक्ति में वाक्यविन्यास का उपयोग करें :
class OK(): __init__ = lambda self, *isok: setattr(self, 'isok', isok); __enter__ = lambda self: None; __exit__ = lambda self, exc_type, exc_value, traceback: (True if not self.isok or issubclass(exc_type, self.isok) else None) if exc_type else None
किसी भी त्रुटि को अनदेखा करें:
with OK(): 1/0
निर्दिष्ट त्रुटियों को अनदेखा करें:
with OK(ZeroDivisionError, NameError): 1/0