বিবৃতিটির else
al চ্ছিক ধারাটির ব্যবহারটি কী try
?
বিবৃতিটির else
al চ্ছিক ধারাটির ব্যবহারটি কী try
?
উত্তর:
else
যদি ব্লকের বিবৃতিগুলি কার্যকর করা হয় যদি কার্যকর হয় নীচে থেকে পড়ে try
- যদি কোনও ব্যতিক্রম না ঘটে। সত্য, আমি কখনও প্রয়োজন খুঁজে পাই না।
তবে ব্যতিক্রমগুলি নোটগুলি পরিচালনা করে:
অন্য ধারাটির ব্যবহার ট্রাই ক্লজে অতিরিক্ত কোড যুক্ত করার চেয়ে ভাল কারণ এটি দুর্ঘটনাক্রমে এমন ব্যতিক্রম ধরা এড়ায় যা কোড দ্বারা সুরক্ষিত করা না করে চেষ্টা করা হয়েছিল ... বিবৃতি ব্যতীত।
সুতরাং, যদি আপনার এমন কোনও পদ্ধতি থাকে যা উদাহরণস্বরূপ, একটি নিক্ষেপ IOError
করতে পারে এবং আপনি এটি ব্যতিক্রমগুলি ধরতে চান তবে প্রথম ক্রিয়াকলাপটি সফল হলে আপনি আরও কিছু করতে চান, এবং আপনি কোনও আইওরর ধরতে চান না এই অপারেশন, আপনি এই জাতীয় কিছু লিখতে পারেন:
try:
operation_that_can_throw_ioerror()
except IOError:
handle_the_exception_somehow()
else:
# we don't want to catch the IOError if it's raised
another_operation_that_can_throw_ioerror()
finally:
something_we_always_need_to_do()
আপনি শুধু করিয়ে দিলে another_operation_that_can_throw_ioerror()
পর operation_that_can_throw_ioerror
, except
দ্বিতীয় কল ত্রুটি ধরা হবে। এবং যদি আপনি এটি পুরো try
ব্লকের পরে রাখেন তবে এটি সর্বদা চালানো হবে এবং এটির পরে না finally
। else
আপনি কি নিশ্চিতরূপে করার সুবিধা প্রদান
finally
ব্লকের আগে চালানো , এবংIOError
এটি যে কোনও উত্থাপন করে তা এখানে ধরা পড়ে নাreturn
, continue
বা break
।
শৈলী এবং পঠনযোগ্যতা ব্যবহার করার একটি বড় কারণ রয়েছে else
। কোড রাখার পক্ষে এটি একটি ভাল ধারণা যা তাদের সাথে ডিল করা কোডের কাছে ব্যতিক্রম ঘটায়। উদাহরণস্বরূপ, এগুলি তুলনা করুন:
try:
from EasyDialogs import AskPassword
# 20 other lines
getpass = AskPassword
except ImportError:
getpass = default_getpass
এবং
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
else:
# 20 other lines
getpass = AskPassword
দ্বিতীয়টি যখন ভাল except
তাড়াতাড়ি ফিরে না আসতে পারে, বা ব্যতিক্রমটিকে আবার ছুঁড়ে ফেলতে পারে good যদি সম্ভব হয় তবে আমি লিখতাম:
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
return False # or throw Exception('something more descriptive')
# 20 other lines
getpass = AskPassword
দ্রষ্টব্য: সদ্য পোস্ট করা সদৃশ থেকে উত্তর এখানে অনুলিপি করা হয়েছে , অতএব এই সমস্ত "এসকপ্যাসওয়ার্ড" স্টাফ।
একটি ব্যবহার: এমন কিছু কোড পরীক্ষা করুন যা একটি ব্যতিক্রম বাড়াতে পারে।
try:
this_should_raise_TypeError()
except TypeError:
pass
except:
assert False, "Raised the wrong exception type"
else:
assert False, "Didn't raise any exception"
(এই কোডটি বাস্তবে আরও জেনেরিক পরীক্ষার জন্য বিমূর্ত করা উচিত))
পাইথন চেষ্টা - অন্য
else
ট্রাই স্টেটমেন্টের al চ্ছিক ধারাটির ব্যবহারটি কী ?
উদ্দেশ্য ব্যবহারটি হ'ল আরও কোড চালনার জন্য একটি প্রসঙ্গ আছে যদি এটির ব্যতিক্রম হ্যান্ডেল হওয়ার আশঙ্কা করা হত না।
এই প্রসঙ্গে দুর্ঘটনাক্রমে ত্রুটিগুলি পরিচালনা করা এড়ানো যায় যা আপনি প্রত্যাশা করেননি।
কিন্তু এটা সুনির্দিষ্ট অবস্থার যে run অন্য দফা কারণ বুঝতে গুরুত্বপূর্ণ, কারণ return
, continue
এবং break
নিয়ন্ত্রণ প্রবাহ বিঘ্নিত করতে else
।
else
বিবৃতি চালায় তাহলে আছে কোন ব্যতিক্রম এবং ফলে বাধাপ্রাপ্ত না হলে return
, continue
অথবা break
বিবৃতি।
And
else
চ্ছিক ধারাটি কার্যকর করা হয় যদি এবং কখন এই ধারাটির শেষের দিকে নিয়ন্ত্রণ প্রবাহিত হয়try
*
(বোল্ডিং যোগ করা হয়েছে)) এবং পাদটীকাটি পড়ে:
* বর্তমানে, নিয়ন্ত্রণ একটি ব্যতিক্রম বা সঞ্চালনের ক্ষেত্রে ব্যতীত "শেষ বন্ধ প্রবাহিত"
return
,continue
অথবাbreak
বিবৃতি।
এর জন্য ক্লজ ( ব্যাকরণ দেখুন ) ব্যতীত কমপক্ষে একটি পূর্বের প্রয়োজন । সুতরাং এটি else
(এবং finally
) alচ্ছিক হওয়ার সাথে সত্যই এটি "চেষ্টা-অন্য নয়," এটি "চেষ্টা-ছাড়া-অন্য (-ফাইনালি)" নয় ।
পাইথন টিউটোরিয়াল দেয়ার উদ্দেশ্যে ব্যবহারের উপর ব্যাখ্যা করেছেন:
চেষ্টা করুন ... বিবৃতি ব্যতীত অন্য একটি ধারা রয়েছে, যা উপস্থিত থাকলে অবশ্যই ধারাগুলি বাদে সমস্ত অনুসরণ করতে হবে। কোডের জন্য এটি কার্যকর যে ট্রায়াল ক্লজটি যদি কোনও ব্যতিক্রম না বাড়ায় তবে তা কার্যকর করতে হবে। উদাহরণ স্বরূপ:
for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len(f.readlines()), 'lines' f.close()
অন্য ধারাটির ব্যবহার ট্রাই ক্লজে অতিরিক্ত কোড যুক্ত করার চেয়ে ভাল কারণ এটি দুর্ঘটনাক্রমে এমন ব্যতিক্রম ধরা এড়ায় যা কোড দ্বারা সুরক্ষিত করা না করে চেষ্টা করা হয়েছিল ... বিবৃতি ব্যতীত।
else
অনুসরণ করে কোড বনাম পৃথকীকরণের উদাহরণtry
আপনি যদি কোনও ত্রুটি পরিচালনা করেন তবে else
ব্লকটি চলবে না। উদাহরণ স্বরূপ:
def handle_error():
try:
raise RuntimeError('oops!')
except RuntimeError as error:
print('handled a RuntimeError, no big deal.')
else:
print('if this prints, we had no error!') # won't print!
print('And now we have left the try block!') # will print!
এবং এখন,
>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!
হাঁস-টাইপিংয়ের সাথে ইএএফপি প্যাটার্নটি একত্রিত করার জন্য অন্য চেষ্টা করে দেখুন :
try:
cs = x.cleanupSet
except AttributeError:
pass
else:
for v in cs:
v.cleanup()
আপনার এই জিনিসটি ঠিক আছে কোডটি ভাল হতে পারে:
try:
for v in x.cleanupSet:
v.clenaup()
except AttributeError:
pass
এটি আপনার কোডটিতে দুর্ঘটনাক্রমে গুরুতর ত্রুটিগুলি লুকানোর একটি দুর্দান্ত উপায়। আমি সেখানে ক্লিনআপ টাইপ-এড করেছি, তবে যে অ্যাট্রিবিউটআরআর আমাকে জানাতে পারে তা গিলে ফেলা হচ্ছে। সবচেয়ে খারাপ কথা, যদি আমি এটি সঠিকভাবে লিখেছিলাম তবে ক্লিনআপ পদ্ধতিটি মাঝেমধ্যে এমন কোনও ব্যবহারকারী টাইপ হয়ে যাচ্ছিল যা একটি ভুল নামযুক্ত বৈশিষ্ট্যযুক্ত ছিল, যার ফলে এটি নিঃশব্দে অর্ধ-পথ ব্যর্থ হয়ে একটি ফাইল বন্ধ রেখে দিয়েছে? সৌভাগ্য যে একটি ডিবাগিং।
আপনি যখন এটি পরিষ্কার করতে পেরেছেন তখন আমি সত্যিই এটি দরকারী বলে মনে করি এটি ব্যতিক্রম থাকলেও তা করতে হবে:
try:
data = something_that_can_go_wrong()
except Exception as e: # yes, I know that's a bad way to do it...
handle_exception(e)
else:
do_stuff(data)
finally:
clean_up()
যদিও আপনি এখনই এটির ব্যবহার সম্পর্কে ভাবতে পারেন না, আপনি এখানে বাজি রাখতে পারেন যে এটির জন্য একটি ব্যবহার থাকতে হবে। এখানে একটি অকল্পনীয় নমুনা রয়েছে:
সহ else
:
a = [1,2,3]
try:
something = a[2]
except:
print "out of bounds"
else:
print something
ছাড়া else
:
try:
something = a[2]
except:
print "out of bounds"
if "something" in locals():
print something
something
কোনও ত্রুটি নিক্ষেপ না করা হলে এখানে আপনার পরিবর্তনশীল সংজ্ঞায়িত হয়েছে। আপনি try
এটিকে ব্লকের বাইরে সরাতে পারেন , তবে তারপরে কোনও ভেরিয়েবল সংজ্ঞায়িত করা হলে এর জন্য কিছু অগোছালো সনাক্তকরণ প্রয়োজন।
something = a[2]; print something
চেষ্টা করে ভিতরে কী হয়েছে : ব্লক?
সেখানে একটি চমৎকার উদাহরণ try-else
মধ্যে PEP 380 । মূলত, এটি অ্যালগোরিদমের বিভিন্ন অংশে বিভিন্ন ব্যতিক্রম হ্যান্ডলিং করতে নেমে আসে।
এটি এমন কিছু:
try:
do_init_stuff()
except:
handle_init_suff_execption()
else:
try:
do_middle_stuff()
except:
handle_middle_stuff_exception()
এটি আপনাকে যেখানে ব্যতিক্রম ঘটে তার নিকটতম ব্যতিক্রম হ্যান্ডলিং কোডটি লিখতে দেয়।
থেকে ত্রুটি এবং ব্যতিক্রমগুলি # ব্যতিক্রম পরিচালনা - docs.python.org
try ... except
বিবৃতি একটি ঐচ্ছিক হয়েছেelse
দফা, যা, যখন বর্তমান, ক্লজ ছাড়া সমস্ত অনুসরণ করতে হবে। কোডের জন্য এটি কার্যকর যে ট্রায়াল ক্লজটি যদি কোনও ব্যতিক্রম না বাড়ায় তবে তা কার্যকর করতে হবে। উদাহরণ স্বরূপ:for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len(f.readlines()), 'lines' f.close()
অন্য ধারাটির ব্যবহার ট্রাই ক্লজে অতিরিক্ত কোড যুক্ত করার চেয়ে ভাল কারণ এটি দুর্ঘটনাক্রমে এমন ব্যতিক্রম ধরা এড়ায় যা কোড দ্বারা সুরক্ষিত করা না করে চেষ্টা করা হয়েছিল ... বিবৃতি ব্যতীত।
পাইথন রেফারেন্সের দিকে তাকালে মনে হয় এটি else
কার্যকর হয় try
যখন কোনও ব্যতিক্রম নেই after Claচ্ছিক অন্য ক্লজটি কার্যকর করা হয় যদি এবং কখন চেষ্টা ক্লজটির শেষের দিকে নিয়ন্ত্রণ প্রবাহিত হয়। 2 অন্য ধারাটিতে ব্যতিক্রম পূর্ববর্তী দ্বারা ধারাগুলি ব্যতীত পরিচালিত হয় না।
পাইথনে ডুব দেওয়ার একটি উদাহরণ রয়েছে যেখানে, আমি যদি সঠিকভাবে বুঝতে পারি তবে try
ব্লকটিতে তারা একটি মডিউল আমদানি করার চেষ্টা করে, যখন এটি ব্যর্থ হয় আপনি ব্যতিক্রম হন এবং ডিফল্ট বাঁধাই করেন কিন্তু এটি যখন কাজ করে তখন আপনার কাছে else
ব্লকের মধ্যে যেতে হবে এবং যা প্রয়োজন তা আবদ্ধ করার বিকল্প রয়েছে (দেখুন দেখুন) উদাহরণ এবং ব্যাখ্যা জন্য লিঙ্ক)।
আপনি যদি catch
ব্লকে কাজ করার চেষ্টা করেন তবে এটি অন্য একটি ব্যতিক্রম হতে পারে - আমার ধারণা else
ব্লকটি কার্যকর where
try
ব্লকটি থেকে ফিরে আসতে পারেন ।
এটাই. চেষ্টা করা ব্যতীত 'অন্য' ব্লক কোডটির জন্য উপস্থিত রয়েছে যা চেষ্টা করা অপারেশন সফল হওয়ার পরে (এবং শুধুমাত্র যখন) চলে। এটি ব্যবহার করা যেতে পারে, এবং এটি অপব্যবহার করা যেতে পারে।
try:
fp= open("configuration_file", "rb")
except EnvironmentError:
confdata= '' # it's ok if the file can't be opened
else:
confdata= fp.read()
fp.close()
# your code continues here
# working with (possibly empty) confdata
ব্যক্তিগতভাবে, আমি এটি পছন্দ করি এবং উপযুক্ত হলে এটি ব্যবহার করি। এটি শব্দার্থগতভাবে বিবৃতিগুলিকে গ্রুপ করে।
সম্ভবত একটি ব্যবহার হতে পারে:
#debug = []
def debuglog(text, obj=None):
" Simple little logger. "
try:
debug # does global exist?
except NameError:
pass # if not, don't even bother displaying
except:
print('Unknown cause. Debug debuglog().')
else:
# debug does exist.
# Now test if you want to log this debug message
# from caller "obj"
try:
if obj in debug:
print(text) # stdout
except TypeError:
print('The global "debug" flag should be an iterable.')
except:
print('Unknown cause. Debug debuglog().')
def myfunc():
debuglog('Made it to myfunc()', myfunc)
debug = [myfunc,]
myfunc()
হতে পারে এটি আপনাকেও ব্যবহারের দিকে নিয়ে যাবে।
try: ... else:
আপনি যে অবস্থাতে ডাটাবেস প্রশ্নগুলি চালাচ্ছেন এবং একই প্রশ্নের স্বাদ / প্রকারের একটি পৃথক ডাটাবেসে সেই প্রশ্নের ফলাফলগুলি লগইন করছেন সেই পরিস্থিতিতে আমি নির্মাণটি দরকারী বলে পেয়েছি । ধরা যাক যে আমার কাছে প্রচুর কর্মী থ্রেড রয়েছে যা সমস্ত হ্যান্ডলিং ডেটাবেস কোয়েরিতে জমা দেওয়া আছে to
#in a long running loop
try:
query = queue.get()
conn = connect_to_db(<main db>)
curs = conn.cursor()
try:
curs.execute("<some query on user input that may fail even if sanitized">)
except DBError:
logconn = connect_to_db(<logging db>)
logcurs = logconn.cursor()
logcurs.execute("<update in DB log with record of failed query")
logcurs.close()
logconn.close()
else:
#we can't put this in main try block because an error connecting
#to the logging DB would be indistinguishable from an error in
#the mainquery
#We can't put this after the whole try: except: finally: block
#because then we don't know if the query was successful or not
logconn = connect_to_db(<logging db>)
logcurs = logconn.cursor()
logcurs.execute("<update in DB log with record of successful query")
logcurs.close()
logconn.close()
#do something in response to successful query
except DBError:
#This DBError is because of a problem with the logging database, but
#we can't let that crash the whole thread over what might be a
#temporary network glitch
finally:
curs.close()
conn.close()
#other cleanup if necessary like telling the queue the task is finished
অবশ্যই যদি আপনি ফেলে দেওয়া হতে পারে এমন সম্ভাব্য ব্যতিক্রমগুলির মধ্যে পার্থক্য করতে পারেন তবে আপনাকে এটি ব্যবহার করতে হবে না, তবে কোডের একটি সফল টুকরোতে প্রতিক্রিয়া প্রকাশিত কোডটি সফল টুকরা হিসাবে একই ব্যতিক্রম ছুঁড়ে ফেলতে পারে, এবং আপনি ঠিক করতে পারবেন না দ্বিতীয় সম্ভাব্য ব্যতিক্রমটি যেতে দিন বা সাফল্যে তাত্ক্ষণিকভাবে ফিরে যেতে দিন (যা আমার ক্ষেত্রে থ্রেডটি মেরে ফেলবে), তবে এটি কার্যকর হয় না।
else
প্রতিটি except
ব্লকে ঘটে যাওয়া কার্যকারিতা পরিপূরক করতে প্রায়শই একটি ব্লক উপস্থিত থাকতে পারে ।
try:
test_consistency(valuable_data)
except Except1:
inconsistency_type = 1
except Except2:
inconsistency_type = 2
except:
# Something else is wrong
raise
else:
inconsistency_type = 0
"""
Process each individual inconsistency down here instead of
inside the except blocks. Use 0 to mean no inconsistency.
"""
এই ক্ষেত্রে, inconsistency_type
ব্লক ব্যতীত প্রতিটিটিতে সেট করা থাকে, যাতে আচরণটি নো-ত্রুটির ক্ষেত্রে পরিপূরক হয় else
।
অবশ্যই, আমি এটিকে এমন একটি প্যাটার্ন হিসাবে বর্ণনা করছি যা কোনও দিন আপনার নিজের কোডে উঠে আসতে পারে। এই নির্দিষ্ট ক্ষেত্রে, আপনি যাইহোক ব্লকের inconsistency_type
আগে কেবল 0 তে সেট করেছেন try
।
এখানে অন্য একটি জায়গা যেখানে আমি এই নিদর্শনটি ব্যবহার করতে চাই:
while data in items:
try
data = json.loads(data)
except ValueError as e:
log error
else:
# work on the `data`
continue
পরিবর্তে ব্যবহার করতে পারেন - "ব্রেকআউট আউট" প্যাটার্ন। কোডটি পড়তে সহজ করে তোলে এটি আপনাকে "অন্য" ধারা এবং এর প্রবর্তনকে ছাড়তে দেয়।
আমি যে ব্যবহারের পরিস্থিতিগুলির কথা ভাবতে পারি তার মধ্যে একটি অনির্দেশ্য ব্যতিক্রম, যা আপনি আবার চেষ্টা করলে অবরুদ্ধ হতে পারে। উদাহরণস্বরূপ, ট্রাই ব্লকের ক্রিয়াকলাপগুলি এলোমেলো সংখ্যার সাথে জড়িত থাকে:
while True:
try:
r = random.random()
some_operation_that_fails_for_specific_r(r)
except Exception:
continue
else:
break
তবে যদি ব্যতিক্রমটির পূর্বাভাস দেওয়া যায় তবে আপনার ব্যতিক্রমের আগে সর্বদা বৈধতা বেছে নেওয়া উচিত। যাইহোক, সমস্ত কিছুর পূর্বাভাস দেওয়া যায় না, তাই এই কোড প্যাটার্নটির নিজস্ব স্থান রয়েছে।
break
ভিতরে ভিতরে রেখে এটি করতে পারেন try
যা পরিষ্কার আইএমও, এবং আপনার এটির দরকার নেই else
। এছাড়াও continue
সত্যিই প্রয়োজন হয় না, আপনি ঠিক করতে পারেন pass
।
আমি else
সম্ভবত একটি ভুল কনফিগার ফাইল ব্যবহার করার জন্য দরকারী পেয়েছি :
try:
value, unit = cfg['lock'].split()
except ValueError:
msg = 'lock monitoring config must consist of two words separated by white space'
self.log('warn', msg)
else:
# get on with lock monitoring if config is ok
lock
কনফিগারেশন পড়ার ব্যতিক্রম লক মনিটরিং নিষ্ক্রিয় করে এবং ভ্যালুএরফার্স একটি সহায়ক সতর্কতা বার্তা লগ করে।
মনে করুন আপনার প্রোগ্রামিংয়ের যুক্তি কোনও প্রদত্ত কী সহ কোনও অভিধানে প্রবেশ রয়েছে কিনা তার উপর নির্ভর করে। আপনি নির্মাণ dict.get(key)
ব্যবহারের ফলাফল পরীক্ষা if... else...
করতে পারেন, বা আপনি এটি করতে পারেন:
try:
val = dic[key]
except KeyError:
do_some_stuff()
else:
do_some_stuff_with_val(val)
আমি অন্য ব্যবহারের কেস যুক্ত করব যা ডিবি সেশনগুলি পরিচালনা করার সময় সরাসরি দেখায়:
# getting a DB connection
conn = db.engine.connect()
# and binding to a DB session
session = db.get_session(bind=conn)
try:
# we build the query to DB
q = session.query(MyTable).filter(MyTable.col1 == 'query_val')
# i.e retrieve one row
data_set = q.one_or_none()
# return results
return [{'col1': data_set.col1, 'col2': data_set.col2, ...}]
except:
# here we make sure to rollback the transaction,
# handy when we update stuff into DB
session.rollback()
raise
else:
# when no errors then we can commit DB changes
session.commit()
finally:
# and finally we can close the session
session.close()
else:
ব্লক বিভ্রান্তিকর এবং (প্রায়) অনর্থক। এটি বিবৃতি for
এবং while
বিবৃতি অংশ ।
প্রকৃতপক্ষে, এমনকি কোনও if
স্টেটমেন্টেও, এটি else:
সত্যই ভয়ানক উপায়ে ব্যবহার করা যেতে পারে এমন বাগগুলি তৈরি করা যায় যা খুঁজে পাওয়া খুব শক্ত।
এই বিবেচনা.
if a < 10:
# condition stated explicitly
elif a > 10 and b < 10:
# condition confusing but at least explicit
else:
# Exactly what is true here?
# Can be hard to reason out what condition is true
দু'বার ভাবুন else:
। এটি সাধারণত একটি সমস্যা। এটি কোনও if
স্টেটমেন্ট বাদে এড়িয়ে চলুন এবং তারপরেও else
এটিকে স্পষ্ট করার জন্য - শর্তটি নথিভুক্ত করার বিষয়টি বিবেচনা করুন ।
if x > 0: return "yes"
এবং if x <= 0: return "no"
। এখন একজন ব্যক্তি এসে কথায় কথায় x > 1
একটি পরিবর্তন করে তবে অন্যটিকে পরিবর্তন করতে ভুলে যায়। প্রতিশ্রুতিবদ্ধ হবে যে বাগ সংখ্যা হ্রাস কিভাবে। if else
ধারা কখনও কখনও অনেক লাইন পৃথক হয়। ডিআরওয়াই একটি ভাল অনুশীলন, প্রায়শই না আসলেই সত্য। (ডাবল পোস্টের জন্য দুঃখিত)