উত্তর:
assert
বিবৃতি প্রায় প্রতিটি প্রোগ্রামিং ভাষা বিদ্যমান। এটি আপনার প্রোগ্রামের প্রথমদিকে সমস্যাগুলি সনাক্ত করতে সহায়তা করে, কারণ কারণটি পরিষ্কার, পরে অন্য কোনও ক্রিয়াকলাপের পার্শ্ব-প্রতিক্রিয়া হিসাবে নয়।
যখন তুমি কর...
assert condition
... আপনি প্রোগ্রামটিকে সেই শর্তটি পরীক্ষা করতে বলছেন, এবং শর্তটি মিথ্যা হলে অবিলম্বে একটি ত্রুটি ট্রিগার করবে।
পাইথনে এটি প্রায় এর সমান:
if not condition:
raise AssertionError()
পাইথন শেলটিতে এটি ব্যবহার করে দেখুন:
>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
জোর দেওয়াতে একটি alচ্ছিক বার্তা অন্তর্ভুক্ত থাকতে পারে এবং দোভাষা চালানোর সময় আপনি এগুলি অক্ষম করতে পারেন।
দৃ f়তা ব্যর্থ হলে একটি বার্তা মুদ্রণ করতে:
assert False, "Oh no! This assertion failed!"
কোনও ফাংশনের মতো কল করতে বন্ধনী ব্যবহার করবেন নাassert
। এটি একটি বিবৃতি। যদি আপনি না assert(condition, message)
আপনি চলমান করা হবে assert
একটি সঙ্গে (condition, message)
প্রথম প্যারামিটার হিসাবে tuple।
তাদের অক্ষম করার জন্য, python
অনুকূলিত মোডে চলার সময় , কোথায় __debug__
রয়েছে False
, দৃsert় বিবৃতি উপেক্ষা করা হবে। কেবল -O
পতাকাটি পাস করুন :
python -O script.py
সম্পর্কিত ডকুমেন্টেশন জন্য এখানে দেখুন ।
if not condition: raise AssertError()
কেন আমি দৃ as়তা ব্যবহার করব? এমন কোনও শর্ত আছে যার অধীনে জোর দেওয়া if not condition
বিবৃতি কেবল সংক্ষিপ্ত আকারের হওয়া ছাড়া আরও ভাল ?
if
)। আরও তথ্যের জন্য দস্তাবেজগুলি পড়ুন :)
assert
, তবে সমস্ত উত্তর পড়ার পরে, আমার সম্পূর্ণরূপে আমি কিছুই পাইনি!
প্রথম বন্ধনী জন্য নজর রাখুন। উপরে যেমনটি ইঙ্গিত করা হয়েছে, পাইথন 3- assert
তে এখনও একটি বিবৃতি রয়েছে , সুতরাং এর সাথে উপমা অনুসারে print(..)
, কেউ একইরূপে এক্সপ্লোলেট করতে পারে assert(..)
বা raise(..)
আপনার উচিত হবে না।
এটি গুরুত্বপূর্ণ কারণ:
assert(2 + 2 == 5, "Houston we've got a problem")
কাজ করবে না, বিপরীতে
assert 2 + 2 == 5, "Houston we've got a problem"
যেহেতু প্রথমটি কাজ করবে না তা হ'ল bool( (False, "Houston we've got a problem") )
মূল্যায়ন True
।
বিবৃতিতে assert(False)
, এগুলি কেবলমাত্র অপ্রয়োজনীয় প্রথম বন্ধনী False
, যা তাদের সামগ্রীর মূল্যায়ন করে। তবে assert(False,)
প্রথম বন্ধনীগুলির সাথে এখন একটি টিউপল এবং একটি খালি খালি টিপল True
বুলিয়ান প্রসঙ্গে মূল্যায়ন করে।
assert (2 + 2 = 5), "Houston we've got a problem"
ঠিক আছে, হ্যাঁ?
assert (2 + 2 = 5), "Houston we've got a problem"
কাজ করবে না ... তবে এটির দৃ statement় বিবৃতি দিয়ে কিছুই করার নেই, যা ঠিক আছে fine আপনার শর্ত কাজ করবে না কারণ এটি শর্ত নয়। একটি দ্বিতীয় অনুপস্থিত =
।
অন্য উত্তরগুলি assert
যেমন উল্লেখ করেছে, প্রদত্ত শর্তটি সত্য না হলে একটি ব্যতিক্রম ছোঁড়ার অনুরূপ। একটি গুরুত্বপূর্ণ পার্থক্য হ'ল দৃ the় প্রতিবেদনগুলি অগ্রাহ্য করা হবে যদি আপনি অনুকূলিতকরণ বিকল্পের সাথে আপনার কোডটি সংকলন করেন -O
। ডকুমেন্টেশন বলছেন যে assert expression
ভাল সমতূল্য হিসেবে বর্ণনা করা যায়
if __debug__:
if not expression: raise AssertionError
আপনি যদি আপনার কোডটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করতে চান তবে এটি কার্যকর হতে পারে, আপনি যখন খুশি হন তখন একটি অনুকূলিত সংস্করণ প্রকাশ করুন - যখন আপনার দৃ .়বিশ্বাসের কোনওটিই ব্যর্থ হয় না - যখন অপ্টিমাইজেশন চালু থাকে, তখন __debug__
ভেরিয়েবলটি মিথ্যা হয়ে যায় এবং শর্তগুলি মূল্যায়ন বন্ধ করে দেয়। আপনি যদি দাবিগুলিতে নির্ভর করে থাকেন এবং তারা অদৃশ্য হয়ে গেছে তা বুঝতে না পারলে এই বৈশিষ্ট্যটি আপনাকেও খুঁজে পেতে পারে।
if Not Error: raise Exception(“ this is a error”)
? এইভাবে, প্রোগ্রামটি তবুও ত্রুটির উত্সটি দেখায়, যখন ব্যবহারকারী এটি চালায় ..
assert
বিবৃতিটি ব্যবহার করা উচিত ? এখানে অনুমানটি হ'ল যে প্রোগ্রামটি শেষ ব্যবহারকারীর কাছে প্রকাশিত হয়, আপনি -O পতাকা ব্যবহার করছেন, সুতরাং ধরে নিবেন যে সমস্ত বাগ মুছে ফেলা হয়েছে। সুতরাং, কোনও ত্রুটি বা প্রোগ্রাম ক্রাশ প্রোগ্রামের ইনপুটগুলির কারণে যা চুক্তি অনুসারে বৈধ, তবে প্রোগ্রামটি পরিচালনা করতে পারে না। সুতরাং এটি ব্যবহারকারী হিসাবে যেমন সতর্ক করা উচিত।
পাইথনের দৃ as়তার উদ্দেশ্য হ'ল বিকাশকারীদের কোনও প্রোগ্রামে অপ্রাপ্তযোগ্য ত্রুটি সম্পর্কে অবহিত করা ।
প্রস্তাবগুলি প্রত্যাশিত ত্রুটি অবস্থার সংকেত দেওয়ার উদ্দেশ্যে নয়, যেমন "ফাইলটি পাওয়া যায় নি", যেখানে কোনও ব্যবহারকারী সংশোধনমূলক পদক্ষেপ নিতে পারেন (বা কেবল আবার চেষ্টা করুন)।
এটি দেখার আরও একটি উপায় বলতে বলা হয় যে আপনার কোডগুলিতে জোর দেওয়া অভ্যন্তরীণ স্ব-চেক । তারা আপনার কোডে কিছু শর্তকে অসম্ভব হিসাবে ঘোষণা করে কাজ করে । যদি এই শর্তগুলি ধরে না থাকে তার মানে প্রোগ্রামটিতে একটি বাগ রয়েছে।
যদি আপনার প্রোগ্রামটি বাগ-মুক্ত হয় তবে এই শর্তগুলি কখনই ঘটবে না। কিন্তু যদি তাদের মধ্যে একজন আছে একটি প্রোগ্রাম একটি বিবৃতি আপনি ঠিক কহন ত্রুটি ঘটেছে, যা "অসম্ভব" শর্ত আলোড়ন সৃষ্টি ছিল বিপর্যস্ত হবে ঘটবে। এটি আপনার প্রোগ্রামগুলিতে ত্রুটিগুলি খুঁজে বের করতে এবং এটি ঠিক করা আরও সহজ করে তোলে।
পাইথনের যে বক্তব্য লিখেছি সে সম্পর্কে একটি টিউটোরিয়াল থেকে এখানে একটি সংক্ষিপ্তসার রইল :
পাইথনের দৃsert় বক্তব্যটি একটি ডিবাগিং সহায়তা, রানটাইম ত্রুটিগুলি পরিচালনা করার কোনও ব্যবস্থা নয়। প্রতিস্থাপনগুলি ব্যবহার করার লক্ষ্যটি হ'ল বিকাশকারীদের ত্রুটির সম্ভাব্য মূল কারণটি আরও দ্রুত খুঁজে বের করা। আপনার প্রোগ্রামে কোনও ত্রুটি না থাকলে কখনও কখনও তদন্তের ত্রুটি উত্থাপন করা উচিত নয়।
assert
বিবৃতিটি বোঝার জন্য এবং কখন এটি ব্যবহার করতে হবে তা খুব সহায়ক । আপনি নিবন্ধে প্রচুর শর্তাদি বোঝার চেষ্টা করছি।
assert store.product_exists(product_id), 'Unknown product id'
এটি একটি ভাল অনুশীলন নয়, কারণ যদি ডিবাগটি বন্ধ করা হয় তবে user
একটি না admin
হলেও পণ্যটি মুছতে সক্ষম হবে। আপনি assert user.is_admin()
একটি unrecoverable
ত্রুটি হিসাবে বিবেচনা ? কেন এটি একটি নয় self-check
?
assert statement
নাকিসুরে কথা, price
একটি ব্যবহারকারীর ইনপুট বিবেচনা করা যেতে? আপনি কেন assert user.is_admin()
ডেটা বৈধতা হিসাবে বিবেচনা করবেন না assert price
?
অন্যরা ইতিমধ্যে আপনাকে ডকুমেন্টেশনের লিঙ্ক দিয়েছে।
আপনি একটি ইন্টারেক্টিভ শেল এ নিম্নলিখিত চেষ্টা করতে পারেন:
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
প্রথম বিবৃতিটি কিছুই করে না, যখন দ্বিতীয়টি ব্যতিক্রম উত্থাপন করে। এটি প্রথম ইঙ্গিত: আপনার কোডের একটি নির্দিষ্ট অবস্থানে (সাধারণত, শুরু (পূর্বশর্ত) এবং কোনও ফাংশন (পোস্টকন্ডিশন) এর শেষের ক্ষেত্রে সত্য হওয়া উচিত এমন শর্তগুলি পরীক্ষা করতে দৃser় পদক্ষেপগুলি কার্যকর।
দৃser়ভাবে চুক্তি দ্বারা প্রোগ্রামিংয়ের সাথে অত্যন্ত আবদ্ধ, যা একটি খুব দরকারী ইঞ্জিনিয়ারিং অনুশীলন:
ডক্স থেকে:
Assert statements are a convenient way to insert debugging assertions into a program
এখানে আপনি আরও পড়তে পারেন: http://docs.python.org/re कृपया / 2.5.2 / ref / assert.html
বাগগুলি ধরার লক্ষ্য নিয়ে প্রোগ্রামারের প্রত্যাশার মতো কোনও প্রোগ্রামের অভ্যন্তরীণ অবস্থা যেমন রয়েছে তা যাচাই করার জন্য জোর দেওয়া পদ্ধতিগত উপায়। নীচে উদাহরণ দেখুন।
>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>>
এখানে একটি সরল উদাহরণ রয়েছে, এটি ফাইলটিতে সংরক্ষণ করুন (আসুন বি.পি. বলুন)
def chkassert(num):
assert type(num) == int
chkassert('a')
এবং ফলাফল যখন $python b.py
Traceback (most recent call last):
File "b.py", line 5, in <module>
chkassert('a')
File "b.py", line 2, in chkassert
assert type(num) == int
AssertionError
যদি জোয়ারের পরে বক্তব্যটি সত্য হয় তবে প্রোগ্রামটি অব্যাহত থাকে, তবে যদি দৃsert়তার পরে বিবৃতিটি মিথ্যা হয় তবে প্রোগ্রামটি একটি ত্রুটি দেয়। যে হিসাবে সহজ।
উদাহরণ:
assert 1>0 #normal execution
assert 0>1 #Traceback (most recent call last):
#File "<pyshell#11>", line 1, in <module>
#assert 0>1
#AssertionError
assert
বিবৃতি প্রায় প্রতিটি প্রোগ্রামিং ভাষা বিদ্যমান। এটি আপনার প্রোগ্রামের প্রথমদিকে সমস্যাগুলি সনাক্ত করতে সহায়তা করে, কারণ কারণটি পরিষ্কার, পরে অন্য কোনও ক্রিয়াকলাপের পার্শ্ব-প্রতিক্রিয়া হিসাবে নয়। তারা সর্বদা একটি True
শর্ত আশা করে ।
আপনি যখন এমন কিছু করেন:
assert condition
আপনি প্রোগ্রামটিকে সেই শর্তটি পরীক্ষা করতে বলছেন এবং যদি এটি ভুল হয় তবে তাত্ক্ষণিকভাবে একটি ত্রুটি ট্রিগার করে।
পাইথনে, assert
অভিব্যক্তি , এর সমান:
if __debug__:
if not <expression>: raise AssertionError
An চ্ছিক বার্তাটি পাস করার জন্য আপনি বর্ধিত অভিব্যক্তিটি ব্যবহার করতে পারেন :
if __debug__:
if not (expression_1): raise AssertionError(expression_2)
পাইথন ইন্টারপ্রেটারে এটি ব্যবহার করে দেখুন:
>>> assert True # Nothing happens because the condition returns a True value.
>>> assert False # A traceback is triggered because this evaluation did not yield an expected value.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
প্রধানত যারা তাদের বক্তব্য assert
এবং if
বিবৃতিগুলির মধ্যে টগল মনে করেন তাদের জন্য ব্যবহার করার আগে তাদের কিছু সতর্কতা অবলম্বন করতে দেখা যায় । ব্যবহারের লক্ষ্যটি assert
হ'ল অনুষ্ঠানগুলি যখন প্রোগ্রামটি একটি শর্ত যাচাই করে এবং ত্রুটিকে অতিক্রম করার বিকল্প বিকল্প গ্রহণ না করে প্রোগ্রামটি তত্ক্ষণাত বন্ধ করা উচিত:
আপনি যেমন খেয়াল করেছেন, assert
বিবৃতিটি দুটি শর্ত ব্যবহার করে। সুতরাং, সুস্পষ্ট পরামর্শের জন্য তাদের বন্ধনী হিসাবে বন্ধনী ব্যবহার করবেন না । যদি আপনি যেমন করেন:
assert (condition, message)
উদাহরণ:
>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
আপনি এটির assert
সাথে চলমান থাকবেন (condition, message)
যা প্রথম প্যারামিটার হিসাবে একটি টিউপলকে উপস্থাপন করে এবং এর ফলে পাইথনের খালি খালি টিপল সর্বদা থাকেTrue
। তবে, আপনি সমস্যা ছাড়াই পৃথকভাবে করতে পারেন:
assert (condition), "message"
উদাহরণ:
>>> assert (1==2), ("This condition returns a %s value.") % "False"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: This condition returns a False value.
যদি আপনি কখন assert
স্টেটমেন্ট ব্যবহারের বিষয়ে ভাবছেন । বাস্তব জীবনে ব্যবহৃত একটি উদাহরণ নিন:
* যখন আপনার প্রোগ্রাম ব্যবহারকারীর দ্বারা প্রবেশ করা প্রতিটি প্যারামিটার বা অন্য যে কোনও কিছু নিয়ন্ত্রণ করতে থাকে:
def loremipsum(**kwargs):
kwargs.pop('bar') # return 0 if "bar" isn't in parameter
kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default
assert (len(kwargs) == 0), "unrecognized parameter passed in %s" % ', '.join(kwargs.keys())
* অন্য একটি ক্ষেত্রে গণিত হয় যখন 0 বা কোনও নির্দিষ্ট সমীকরণের উপর সহগ বা ধ্রুবক হিসাবে ধনাত্মক:
def discount(item, percent):
price = int(item['price'] * (1.0 - percent))
print(price)
assert (0 <= price <= item['price']),\
"Discounted prices cannot be lower than 0 "\
"and they cannot be higher than the original price."
return price
* বা বুলিয়ান বাস্তবায়নের একটি সাধারণ উদাহরণ:
def true(a, b):
assert (a == b), "False"
return 1
def false(a, b):
assert (a != b), "True"
return 0
assert
ডেটা প্রসেসিং বা ডেটা বৈধকরণ কার্যকর করতে স্টেটমেন্টের উপর নির্ভর না করাই সর্বাধিক গুরুত্ব কারণ এই বিবৃতিটি পাইথন ইনিশিয়ালেশনে -O
বা -OO
পতাকা সহ বন্ধ করা যেতে পারে - যার অর্থ যথাক্রমে মান 1, 2, এবং 0 (ডিফল্ট হিসাবে) - বা PYTHONOPTIMIZE
পরিবেশ পরিবর্তনশীল able ।
মান 1:
* জোর দেওয়া অক্ষম;
* বাইটকোড ফাইলগুলির .pyo
পরিবর্তে এক্সটেনশন ব্যবহার করে তৈরি করা হয় .pyc
;
* sys.flags.optimize
1 ( True
) তে সেট করা আছে ;
* এবং, __debug__
সেট করা আছে False
;
মান 2: আরও একটি জিনিস অক্ষম করে
* ডকস্টরিংগুলি অক্ষম করা হয়েছে;
সুতরাং, assert
এক ধরণের প্রত্যাশিত ডেটা বৈধকরণের জন্য বিবৃতিটি ব্যবহার করা অত্যন্ত বিপজ্জনক, এমনকি কিছু সুরক্ষা ইস্যুতেও বোঝায়। তারপরে, আপনার যদি কিছু অনুমতি যাচাই করার দরকার হয় তবে আমি raise AuthError
তার পরিবর্তে আপনাকে সুপারিশ করব । পূর্বশর্ত কার্যকর হিসাবে, assert
সাধারণত গ্রন্থাগার বা মডিউলগুলিতে প্রোগ্রামাররা ব্যবহার করেন যা ব্যবহারকারীদের সরাসরি যোগাযোগ করে না।
সি 2 উইকির সংক্ষিপ্তসার হিসাবে :
একটি প্রোগ্রামের একটি নির্দিষ্ট পয়েন্টে একটি দৃser়তা বুলিয়ান এক্সপ্রেশন যা প্রোগ্রামে কোনও বাগ না থাকলে সত্য হবে unless
আপনি assert
কোনও নির্দিষ্ট প্রোগ্রাম পয়েন্টে কোডটি বোঝার জন্য দলিল করতে একটি বিবৃতি ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি ইনপুট (পূর্বশর্ত), প্রোগ্রামের অবস্থা (আক্রমণকারী), অথবা আউটপুট (পোস্টকন্ডিশন) সম্পর্কে অনুমান বা গ্যারান্টি নথিভুক্ত করতে পারেন।
যদি আপনার দৃ .় বক্তব্য কখনও ব্যর্থ হয়, এটি আপনার (বা আপনার উত্তরসূরি) জন্য সতর্কতা যে আপনি যখন প্রোগ্রামটি লিখেছিলেন তখন আপনার বোঝাপড়াটি ভুল ছিল এবং সম্ভবত এটিতে একটি ত্রুটি রয়েছে।
আরো তথ্যের জন্য, জন Regehr উপর একটা চমৎকার ব্লগ পোস্টে আছে গবেষকেরা ব্যবহারের , পাইথন যা প্রযোজ্য assert
পাশাপাশি বিবৃতি।
পাইথন দৃ sert ়ভাবে মূলত একটি ডিবাগিং সহায়তা যা আপনার কোডের অভ্যন্তরীণ স্ব-পরীক্ষার জন্য শর্ত পরীক্ষা করে। যখন আপনার কোডটি অসম্ভব প্রান্তের ক্ষেত্রে পরিণত হয় তখন ডিগ্রিটি ডিবাগিংটি সত্যই সহজ করে তোলে। এই অসম্ভব কেসগুলি পরীক্ষা করে দেখুন।
আসুন ধরা যাক ছাড়ের পরে আইটেমের দাম গণনা করার জন্য একটি ফাংশন রয়েছে:
def calculate_discount(price, discount):
discounted_price = price - [discount*price]
assert 0 <= discounted_price <= price
return discounted_price
এখানে, ছাড়যুক্ত_প্রাইস কখনই 0 এর চেয়ে কম এবং প্রকৃত দামের চেয়ে বেশি হতে পারে না। সুতরাং, যদি উপরের শর্তটি লঙ্ঘিত হয় তবে দৃ .়তা একটি দৃ Error় ত্রুটি উত্থাপন করে, যা বিকাশকারীকে সনাক্ত করতে পারে যে অসম্ভব কিছু ঘটেছে।
আশা করি এটা সাহায্য করবে :)
assert
ডিবাগিং প্রসঙ্গে দরকারী, তবে কোনও ডিবাগিং প্রসঙ্গে বাইরে নির্ভর করা উচিত নয়।
আমার সংক্ষিপ্ত ব্যাখ্যাটি হ'ল:
assert
উত্সাহটি AssertionError
মিথ্যা হলে উত্থাপিত হয়, অন্যথায় কেবল কোড চালিয়ে যান, এবং যদি কমা থাকে তবে তা যা হবে তা হবে AssertionError: whatever after comma
, এবং কোডটির মতো:raise AssertionError(whatever after comma)
এটি সম্পর্কে একটি সম্পর্কিত টিউটোরিয়াল:
https://www.tutorialspoint.com/python/assertions_in_python.htm
assert
, তবে কখন ব্যবহার করতে হবে (বা ব্যবহার করবেন না) assert
; এরও কোন মূল্য নেই যে assert
অক্ষম হতে পারে __debug__
হয় False
দরকারী হবে।
পাইচার্মে, আপনি যদি কোনও সামগ্রীর প্রকার ঘোষণা করার assert
পাশাপাশি ব্যবহার করেন তবে isinstance
এটি কোডিংয়ের সময় প্যারেন্ট অবজেক্টের পদ্ধতি এবং বৈশিষ্ট্যগুলিকে অ্যাক্সেস করতে দেবে, এটি স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে পূর্ণ হবে।
উদাহরণস্বরূপ, ধরুন self.object1.object2
একটি MyClass
বস্তু।
import MyClasss
def code_it(self):
testObject = self.object1.object2 # at this point, program doesn't know that testObject is a MyClass object yet
assert isinstance(testObject , MyClasss) # now the program knows testObject is a MyClass object
testObject.do_it() # from this point on, PyCharm will be able to auto-complete when you are working on testObject
অন্যান্য উত্তরে লিখিত হিসাবে, assert
বিবৃতি একটি নির্দিষ্ট সময়ে প্রোগ্রামের অবস্থা পরীক্ষা করতে ব্যবহৃত হয়।
সম্পর্কিত বার্তা, প্রথম বন্ধনী বা -O
বিকল্প এবং __debug__
ধ্রুবক সম্পর্কে যা বলা হয়েছিল তা আমি পুনরায় বলব না । প্রথম হাতের তথ্যের জন্য ডকটিও পরীক্ষা করে দেখুন । আমি আপনার প্রশ্নে ফোকাস করব: এর ব্যবহার কী assert
? আরও স্পষ্টভাবে, কখন (এবং কখন নয়) একজনের ব্যবহার করা উচিত assert
?
assert
বিবৃতি একটি প্রোগ্রাম ডিবাগ দরকারী, কিন্তু ব্যবহারকারীর ইনপুট চেক করতে নিরুৎসাহিত। আমি নীচের থাম্বের নিয়মটি ব্যবহার করি: এটির পরিস্থিতিটি ঘটে না এমনটি সনাক্ত করতে দৃ keep়তা রাখুন । ব্যবহারকারীর ইনপুটটি ভুল হতে পারে, উদাহরণস্বরূপ একটি পাসওয়ার্ড খুব সংক্ষিপ্ত, তবে এটি এমনটি নয় যা ঘটবে না। যদি কোনও বৃত্তের ব্যাসার্ধ তার ব্যাসার্ধের দ্বিগুণ না হয় তবে আপনি এটির ক্ষেত্রে না হওয়া উচিত ।
আমার মতে সবচেয়ে আকর্ষণীয়, এর ব্যবহারটি বি। মায়ার দ্বারা বর্ণিত চুক্তিassert
অনুসারে প্রোগ্রামিং দ্বারা অনুপ্রাণিত
হয়েছে [অবজেক্ট-ওরিয়েন্টেড সফটওয়্যার কনস্ট্রাকশন] ( https://www.eiffel.org/doc/eiffel/Object-Orimented_Software_Con تعمیر ১০)
2C_2 তম_ সংস্করণ
) এবং [আইফেল প্রোগ্রামিং ভাষায়] প্রয়োগ করা হয়েছে (
https://en.wikedia.org/wiki/Eifel_(programming_language) )। আপনি assert
বিবৃতিটি ব্যবহার করে চুক্তি করে পুরোপুরি প্রোগ্রামিং অনুকরণ করতে পারবেন না , তবে উদ্দেশ্যটি রাখা আকর্ষণীয়।
এখানে একটি উদাহরণ। কল্পনা করুন যে আপনাকে একটি head
ফাংশন লিখতে হবে (যেমন [ head
হাস্কেলের মধ্যে ফাংশন] (
http://www.zvon.org/other/haskell/Outputprelude/head_f.html ))। আপনার প্রদত্ত স্পেসিফিকেশনটি হ'ল: "তালিকাটি খালি না থাকলে তালিকার প্রথম আইটেমটি ফিরিয়ে দিন"। নিম্নলিখিত বাস্তবায়ন দেখুন:
>>> def head1(xs): return xs[0]
এবং
>>> def head2(xs):
... if len(xs) > 0:
... return xs[0]
... else:
... return None
(হ্যাঁ, এটি হিসাবে লেখা যেতে পারে return xs[0] if xs else None
, তবে এটি মূল বিষয় নয়) ।
যদি তালিকাটি খালি না থাকে তবে উভয় ফাংশনের একই ফলাফল রয়েছে এবং এই ফলাফলটি সঠিক:
>>> head1([1, 2, 3]) == head2([1, 2, 3]) == 1
True
সুতরাং, উভয় বাস্তবায়ন সঠিক (আমি আশা করি) সঠিক। আপনি যখন খালি তালিকার প্রধান জিনিসটি নেওয়ার চেষ্টা করেন তখন এগুলি পৃথক হয়:
>>> head1([])
Traceback (most recent call last):
...
IndexError: list index out of range
কিন্তু:
>>> head2([]) is None
True
আবার উভয় বাস্তবায়নই সঠিক, কারণ কারও এই ফাংশনগুলিতে খালি তালিকা পাস করা উচিত নয় (আমরা স্পেসিফিকেশনের বাইরে )। এটি একটি ভুল কল, তবে আপনি যদি এই জাতীয় কল করেন তবে কিছু ঘটতে পারে। একটি ফাংশন একটি ব্যতিক্রম উত্থাপন করে, অন্যটি একটি বিশেষ মান প্রদান করে। সর্বাধিক গুরুত্বপূর্ণ: আমরা এই আচরণের উপর নির্ভর করতে পারি না । যদি xs
খালি থাকে তবে এটি কাজ করবে:
print(head2(xs))
তবে এটি প্রোগ্রামটি ক্রাশ করবে:
print(head1(xs))
কিছু চমক এড়ানোর জন্য, আমি জানতে চাই যখন আমি কোনও ফাংশনে কিছু অপ্রত্যাশিত যুক্তিটি পাস করি। অন্য কথায়: আমি পর্যবেক্ষণযোগ্য আচরণটি কখন নির্ভরযোগ্য নয় তা জানতে চাই, কারণ এটি প্রয়োগের উপর নির্ভর করে, নির্দিষ্টকরণের উপর নয়। অবশ্যই, আমি স্পেসিফিকেশনটি পড়তে পারি, তবে প্রোগ্রামাররা ডক্সগুলি সর্বদা সাবধানতার সাথে পড়েন না।
নিম্নলিখিত প্রভাবটি পাওয়ার জন্য কোডটিতে স্পেসিফিকেশন সন্নিবেশ করার কোনও উপায় থাকলে কল্পনা করুন: আমি যখন স্পেসিফিকেশনটি লঙ্ঘন করি, যেমন: খালি তালিকাটি পাস করে head
, আমি একটি সতর্কতা পাই। এটি সঠিক (অর্থাত্ স্পেসিফিকেশনের সাথে সম্মতিযুক্ত) প্রোগ্রাম লিখতে একটি দুর্দান্ত সহায়তা হবে। এবং এই যেখানে assert
দৃশ্যে প্রবেশ করে:
>>> def head1(xs):
... assert len(xs) > 0, "The list must not be empty"
... return xs[0]
এবং
>>> def head2(xs):
... assert len(xs) > 0, "The list must not be empty"
... if len(xs) > 0:
... return xs[0]
... else:
... return None
এখন আমাদের আছে:
>>> head1([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty
এবং:
>>> head2([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty
নোট করুন যে head1
একটি AssertionError
না, একটি ছুড়ে ফেলে IndexError
। এটা গুরুত্বপূর্ণ কারণ একটি AssertionError
নয় কোন রানটাইম ত্রুটি: এটা স্পেসিফিকেশন লঙ্ঘন ইঙ্গিত। আমি একটি সতর্কতা চেয়েছিলাম, তবে আমি একটি ত্রুটি পেয়েছি। ভাগ্যক্রমে, আমি চেকটি ( -O
বিকল্পটি ব্যবহার করে ) অক্ষম করতে পারি , তবে নিজের ঝুঁকিতে। আমি এটি করব দুর্ঘটনাটি সত্যই ব্যয়বহুল এবং সেরাটির জন্য আশাবাদ hope আমার প্রোগ্রামটি এমন কোনও স্পেসশিপে এম্বেড হয়েছে যেটি একটি ব্ল্যাকহোল দিয়ে ভ্রমণ করবে gine আমি দৃser় প্রতিবেদন অক্ষম করব এবং আশা করি প্রোগ্রাম যতটা সম্ভব ক্রাশ না করার পক্ষে যথেষ্ট শক্ত।
এই উদাহরণটি কেবল পূর্ব শর্তাদি সম্পর্কে ছিল, আপনি assert
পোস্টকন্ডিশনগুলি (ফেরতের মান এবং / অথবা রাষ্ট্র) এবং আক্রমণকারীদের (একটি শ্রেণির রাষ্ট্র) পরীক্ষা করতে ব্যবহার করতে পারেন । মনে রাখবেন যে পোস্টকন্ডিশন এবং আক্রমণকারীদের সাথে চেক assert
করা জটিল হতে পারে:
আপনার কাছে আইফেলের মতো পরিশীলিত কিছু থাকবে না তবে আপনি কোনও প্রোগ্রামের সামগ্রিক মানের উন্নতি করতে পারেন।
সংক্ষেপে বলতে গেলে, assert
বিবৃতিটি এটি সনাক্তকরণের একটি সুবিধাজনক উপায় এটির পরিস্থিতি হওয়া উচিত নয় । নির্দিষ্টকরণের লঙ্ঘন (যেমন শূন্য তালিকায় পাস করা head
) এটি প্রথম শ্রেণীর ক্ষেত্রে এটি হওয়া উচিত নয় । অতএব, assert
বিবৃতিটি কোনও অপ্রত্যাশিত পরিস্থিতি সনাক্ত করতে ব্যবহৃত হতে পারে, তবে স্পেসিফিকেশনটি সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য এটি একটি সুবিধাজনক উপায়। assert
স্পেসিফিকেশন উপস্থাপনের জন্য আপনি একবার কোডটিতে বিবৃতি haveোকালেন , আমরা আশা করতে পারি যে আপনি প্রোগ্রামের মানের উন্নতি করেছেন কারণ ভুল যুক্তি, ভুল ফেরত মান, একটি শ্রেণীর ভুল অবস্থার ... রিপোর্ট করা হবে।
বিন্যাস: দৃsert়তার সাথে অভিব্যক্তি [, যুক্তিগুলি] যখন বক্তব্যটির মুখোমুখি হয়, পাইথন ভাবটি মূল্যায়ন করে the যদি বিবৃতিটি সত্য না হয় তবে একটি ব্যতিক্রম উত্থাপন করা হয় (assertionError)। যদি দৃ f়তা ব্যর্থ হয়, পাইথন অ্যাসারশনআরারের পক্ষে যুক্তি হিসাবে আর্গুমেন্টএক্সপ্রেশন ব্যবহার করে। দৃser়তা ব্যতিরেকে চেষ্টা ব্যতীত অন্য কোনও ব্যতিক্রমের মতো দৃ and়তার সাথে ব্যতিক্রম ধরা ও পরিচালনা করা যেতে পারে, তবে যদি পরিচালনা না করা হয় তবে তারা প্রোগ্রামটি বন্ধ করে দেবে এবং একটি ট্রেসব্যাক তৈরি করবে। উদাহরণ:
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
উপরের কোডটি কার্যকর করা হলে, এটি নিম্নলিখিত ফলাফল উত্পন্ন করে:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
def getUser(self, id, Email):
user_key = id and id or Email
assert user_key
পরামিতিগুলি ফাংশন কলটিতে পাস হয়েছে তা নিশ্চিত করতে ব্যবহার করা যেতে পারে।
if not user_key: raise ValueError()
এখানে শেষ 2 টি অনুচ্ছেদটি দেখুন: উইকি.পাইথন.আর.উমিন
assert
ইনপুট যাচাইকরণের জন্য ব্যবহার করা উচিত নয় কারণ পারেন বৈধতা আউট ছিনতাই করা হবে যদি __debug__
হয় False
। অ-ডিবাগ উদ্দেশ্যে নয় এমন দৃ .়তা হিসাবে ব্যবহারের ফলে লোকেরা ফলাফলগুলি ধরে ফেলতে পারে AssertionError
, যা কম পরিবর্তে ডিবাগিংকে আরও কঠিন করে তুলতে পারে।
>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)
>>> #first we try without assert
>>>if test_us == True:
print("YES! I am right!")
else:
print("I am Wrong, but the program still RUNS!")
I am Wrong, but the program still RUNS!
>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
assert test_us
AssertionError
>>>
মূলত আসর্ট কীওয়ার্ডের অর্থ হ'ল যদি শর্তটি সত্য না হয় তবে এটি একটি এসেন্সারঅররের মাধ্যমে অন্যথায় এটি অজগর হিসাবে উদাহরণস্বরূপ অব্যাহত থাকে।
কোড-1
a=5
b=6
assert a==b
আউটপুট:
assert a==b
AssertionError
কোড-2
a=5
b=5
assert a==b
আউটপুট:
Process finished with exit code 0
assert
তবে কখন ব্যবহার করতে হয় (বা ব্যবহার না করে) উত্তর দেয় না assert
।