পাইথনে "দাবী" ব্যবহার কী?


উত্তর:


1082

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

সম্পর্কিত ডকুমেন্টেশন জন্য এখানে দেখুন ।


92
নীট: জোর দেওয়া একটি বিবৃতি এবং কোনও ফাংশন নয়। এবং প্রিন্টের বিপরীতে পাইথন 3-তে এটি এখনও একটি বিবৃতি
বব স্টেইন

2
@ চেইন অ্যাসিস্টের অর্থ "নিশ্চিত করুন যে * কিছু" সত্য কিনা "। সুতরাং a == 3 নিশ্চিত করে নিশ্চিত করা হবে যে a 3 এর সমান; যদি a 3 এর সমান নয় (যেমন a == 3 মিথ্যা) তবে তা হবে একটি ত্রুটি বাড়ান
এন্ট

5
আমি যদি কেবলমাত্র এটি ব্যবহার করতে পারি তবে if not condition: raise AssertError()কেন আমি দৃ as়তা ব্যবহার করব? এমন কোনও শর্ত আছে যার অধীনে জোর দেওয়া if not conditionবিবৃতি কেবল সংক্ষিপ্ত আকারের হওয়া ছাড়া আরও ভাল ?
alpha_989

6
@ alpha_989 a) এটি সংক্ষিপ্ত এবং আরও পাঠযোগ্য, খ) দোভাষী দৌড়ানোর সময় আপনি দৃ statements় বিবৃতি অক্ষম করতে পারেন (ম্যানুয়ালটির সাথে তেমন নয় if)। আরও তথ্যের জন্য দস্তাবেজগুলি পড়ুন :)
slezica

9
এই উত্তরটি এত বেশি ভোট কীভাবে পায় তা সম্পূর্ণরূপে পায় না, আসলে অন্যরাও উত্তর দেয়। প্রশ্নটি হল "পাইথনে" দৃsert়বিশ্বাসের "কী ব্যবহার?", সুতরাং এটি জিজ্ঞাসা করছে: কখন ব্যবহার করতে হবে, বা আরও সঠিকভাবে: এর ব্যবহারের দৃশ্যপটটি কী assert, তবে সমস্ত উত্তর পড়ার পরে, আমার সম্পূর্ণরূপে আমি কিছুই পাইনি!
lnshi

422

প্রথম বন্ধনী জন্য নজর রাখুন। উপরে যেমনটি ইঙ্গিত করা হয়েছে, পাইথন 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বুলিয়ান প্রসঙ্গে মূল্যায়ন করে।


18
আমি এখানে পেরেন এবং অনুসরণ বার্তা সম্পর্কে সঠিক তথ্য সন্ধান করতে এসেছি। ধন্যবাদ।
সুপারবেক

6
তবে assert (2 + 2 = 5), "Houston we've got a problem"ঠিক আছে, হ্যাঁ?
শেরিলহোহমান

4
@ শেরিলহোমান আপনি নিজেও এটি চালানোর চেষ্টা করতে পারেন এবং এটি কার্যকর হয় কিনা তা দেখুন
ডার্কসিগনাস

2
ভুলে যাবেন না যে লোকেদের প্রায়শই পিইপি 8-কমপ্লিনেন্ট ইনপিলিটিড লাইন ধারাবাহিকতার জন্য বন্ধনী ব্যবহার করা হয় এছাড়াও এটিও ভুলে যাবেন না যে টিউপসগুলি প্রথম বন্ধনী দ্বারা সংজ্ঞায়িত করা হয় না তবে কমাটির অস্তিত্ব দ্বারা (টিপলগুলি প্যারেনের সাথে কিছুই করতে হয় না তবে উদ্দেশ্যগুলি ব্যতীত অপারেটর অগ্রাধিকার)।
কাওবার্ট

4
assert (2 + 2 = 5), "Houston we've got a problem"কাজ করবে না ... তবে এটির দৃ statement় বিবৃতি দিয়ে কিছুই করার নেই, যা ঠিক আছে fine আপনার শর্ত কাজ করবে না কারণ এটি শর্ত নয়। একটি দ্বিতীয় অনুপস্থিত =
n1k31t4

133

অন্য উত্তরগুলি assertযেমন উল্লেখ করেছে, প্রদত্ত শর্তটি সত্য না হলে একটি ব্যতিক্রম ছোঁড়ার অনুরূপ। একটি গুরুত্বপূর্ণ পার্থক্য হ'ল দৃ the় প্রতিবেদনগুলি অগ্রাহ্য করা হবে যদি আপনি অনুকূলিতকরণ বিকল্পের সাথে আপনার কোডটি সংকলন করেন -Oডকুমেন্টেশন বলছেন যে assert expressionভাল সমতূল্য হিসেবে বর্ণনা করা যায়

if __debug__:
   if not expression: raise AssertionError

আপনি যদি আপনার কোডটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করতে চান তবে এটি কার্যকর হতে পারে, আপনি যখন খুশি হন তখন একটি অনুকূলিত সংস্করণ প্রকাশ করুন - যখন আপনার দৃ .়বিশ্বাসের কোনওটিই ব্যর্থ হয় না - যখন অপ্টিমাইজেশন চালু থাকে, তখন __debug__ভেরিয়েবলটি মিথ্যা হয়ে যায় এবং শর্তগুলি মূল্যায়ন বন্ধ করে দেয়। আপনি যদি দাবিগুলিতে নির্ভর করে থাকেন এবং তারা অদৃশ্য হয়ে গেছে তা বুঝতে না পারলে এই বৈশিষ্ট্যটি আপনাকেও খুঁজে পেতে পারে।


এর অর্থ কি, যদি কোনও নির্দিষ্ট পরিবর্তনশীল বা সঠিক ইনপুট (চুক্তি অনুসারে প্রোগ্রামটি লেখা হয়) প্রোগ্রামটি ক্র্যাশ করতে পারে, যখন এটি ব্যবহারকারী দ্বারা চালিত হয় (ধরে নেবেন যে-ও পতাকাটি ব্যবহার করা হয় যখন ব্যবহারকারী চালায় প্রোগ্রাম), আপনি পরিবর্তে ব্যবহার করা উচিত if Not Error: raise Exception(“ this is a error”)? এইভাবে, প্রোগ্রামটি তবুও ত্রুটির উত্সটি দেখায়, যখন ব্যবহারকারী এটি চালায় ..
alpha_989

অন্যদিকে, আপনি যদি আশা করেন যে কোডটি সঠিক যুক্তি / প্রয়োগের কারণে প্রোগ্রামটি ত্রুটিযুক্ত হতে পারে (তবে কোনও প্রোগ্রামের ব্যবহারকারীর সাথে চুক্তি অনুসারে কোনও ইনপুটটির কারণে নয়), আপনার assertবিবৃতিটি ব্যবহার করা উচিত ? এখানে অনুমানটি হ'ল যে প্রোগ্রামটি শেষ ব্যবহারকারীর কাছে প্রকাশিত হয়, আপনি -O পতাকা ব্যবহার করছেন, সুতরাং ধরে নিবেন যে সমস্ত বাগ মুছে ফেলা হয়েছে। সুতরাং, কোনও ত্রুটি বা প্রোগ্রাম ক্রাশ প্রোগ্রামের ইনপুটগুলির কারণে যা চুক্তি অনুসারে বৈধ, তবে প্রোগ্রামটি পরিচালনা করতে পারে না। সুতরাং এটি ব্যবহারকারী হিসাবে যেমন সতর্ক করা উচিত।
alpha_989

@ alpha_989 ঠিক ঠিক। আমি বোধগম্যতা যাচাই বাছাই হিসাবে বিবেচনা করতে চাই যা কেবল বিকাশকারী হিসাবে আপনাকে এটি নিশ্চিত করতে সাহায্য করে যা আপনি বিকাশকালে যা সত্য বলে মনে করেন তা সত্য সত্য।
ক্রিস্টোফার শ্রোবা

52

পাইথনের দৃ as়তার উদ্দেশ্য হ'ল বিকাশকারীদের কোনও প্রোগ্রামে অপ্রাপ্তযোগ্য ত্রুটি সম্পর্কে অবহিত করা ।

প্রস্তাবগুলি প্রত্যাশিত ত্রুটি অবস্থার সংকেত দেওয়ার উদ্দেশ্যে নয়, যেমন "ফাইলটি পাওয়া যায় নি", যেখানে কোনও ব্যবহারকারী সংশোধনমূলক পদক্ষেপ নিতে পারেন (বা কেবল আবার চেষ্টা করুন)।

এটি দেখার আরও একটি উপায় বলতে বলা হয় যে আপনার কোডগুলিতে জোর দেওয়া অভ্যন্তরীণ স্ব-চেক । তারা আপনার কোডে কিছু শর্তকে অসম্ভব হিসাবে ঘোষণা করে কাজ করে । যদি এই শর্তগুলি ধরে না থাকে তার মানে প্রোগ্রামটিতে একটি বাগ রয়েছে।

যদি আপনার প্রোগ্রামটি বাগ-মুক্ত হয় তবে এই শর্তগুলি কখনই ঘটবে না। কিন্তু যদি তাদের মধ্যে একজন আছে একটি প্রোগ্রাম একটি বিবৃতি আপনি ঠিক কহন ত্রুটি ঘটেছে, যা "অসম্ভব" শর্ত আলোড়ন সৃষ্টি ছিল বিপর্যস্ত হবে ঘটবে। এটি আপনার প্রোগ্রামগুলিতে ত্রুটিগুলি খুঁজে বের করতে এবং এটি ঠিক করা আরও সহজ করে তোলে।

পাইথনের যে বক্তব্য লিখেছি সে সম্পর্কে একটি টিউটোরিয়াল থেকে এখানে একটি সংক্ষিপ্তসার রইল :

পাইথনের দৃsert় বক্তব্যটি একটি ডিবাগিং সহায়তা, রানটাইম ত্রুটিগুলি পরিচালনা করার কোনও ব্যবস্থা নয়। প্রতিস্থাপনগুলি ব্যবহার করার লক্ষ্যটি হ'ল বিকাশকারীদের ত্রুটির সম্ভাব্য মূল কারণটি আরও দ্রুত খুঁজে বের করা। আপনার প্রোগ্রামে কোনও ত্রুটি না থাকলে কখনও কখনও তদন্তের ত্রুটি উত্থাপন করা উচিত নয়।


নিবন্ধের জন্য ধন্যবাদ। assertবিবৃতিটি বোঝার জন্য এবং কখন এটি ব্যবহার করতে হবে তা খুব সহায়ক । আপনি নিবন্ধে প্রচুর শর্তাদি বোঝার চেষ্টা করছি।
alpha_989

আমি ভেবেছিলাম আমি মন্তব্যগুলি এখানে পোস্ট করব যাতে স্পষ্টতা থেকে আরও অনেক লোক উপকৃত হতে পারে। প্রশ্নগুলি খুব নির্বোধ হলে দুঃখিত।
alpha_989

আপনি যে লিঙ্কটি লিঙ্ক করেছেন তাতে আপনি একটি উদাহরণ দিয়েছেন যেখানে আপনি উল্লেখ করেছেন যে `দাবী করা <0 = দাম <= পণ্য ['দাম']` সঠিক, তবে sert assert user.is_admin () ব্যবহার করে, 'মুছে ফেলার জন্য প্রশাসনের অধিকার থাকতে হবে '`এবং assert store.product_exists(product_id), 'Unknown product id'এটি একটি ভাল অনুশীলন নয়, কারণ যদি ডিবাগটি বন্ধ করা হয় তবে userএকটি না adminহলেও পণ্যটি মুছতে সক্ষম হবে। আপনি assert user.is_admin()একটি unrecoverableত্রুটি হিসাবে বিবেচনা ? কেন এটি একটি নয় self-check?
alpha_989

আপনি যে 'user.is_admin বিবেচনা করে () `একটি ব্যবহারকারীর ইনপুট এবং অত: পর একটি ইন ব্যবহার করা উচিত নয় assert statementনাকিসুরে কথা, priceএকটি ব্যবহারকারীর ইনপুট বিবেচনা করা যেতে? আপনি কেন assert user.is_admin()ডেটা বৈধতা হিসাবে বিবেচনা করবেন না assert price?
alpha_989

1
@ ল্যারিক্সডিসিডুয়া নোপ, আপনি কেবল এটি আমার ওয়েবসাইটে পড়তে পারেন, টিউটোরিয়ালটি সর্বজনীনভাবে উপলব্ধ। আপনি যদি নিউজলেটারে আগ্রহী না হন তবে কেবল এস্কেপ করুন বা সামান্য "এক্স" চিহ্নটি ক্লিক করুন। এই সাহায্য আশা :-)
dbader

51

অন্যরা ইতিমধ্যে আপনাকে ডকুমেন্টেশনের লিঙ্ক দিয়েছে।

আপনি একটি ইন্টারেক্টিভ শেল এ নিম্নলিখিত চেষ্টা করতে পারেন:

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

প্রথম বিবৃতিটি কিছুই করে না, যখন দ্বিতীয়টি ব্যতিক্রম উত্থাপন করে। এটি প্রথম ইঙ্গিত: আপনার কোডের একটি নির্দিষ্ট অবস্থানে (সাধারণত, শুরু (পূর্বশর্ত) এবং কোনও ফাংশন (পোস্টকন্ডিশন) এর শেষের ক্ষেত্রে সত্য হওয়া উচিত এমন শর্তগুলি পরীক্ষা করতে দৃser় পদক্ষেপগুলি কার্যকর।

দৃser়ভাবে চুক্তি দ্বারা প্রোগ্রামিংয়ের সাথে অত্যন্ত আবদ্ধ, যা একটি খুব দরকারী ইঞ্জিনিয়ারিং অনুশীলন:

http://en.wikedia.org/wiki/Design_by_contract


সুতরাং এর অর্থ কি আমরা দাবী করার মতো পরিস্থিতিতে কোডটি চেক করতে পারি (2> 5) এবং ত্রুটি বাড়িয়ে অন্যটি চালিয়ে যেতে পারি?

20
প্যারেনস হারিয়ে ফেলুন, জোর দেওয়া কোনও ফাংশন নয়।
পিলমুনচারে

2
পেরেন্স হারানো যতটা মনে হয় তত বেশি গুরুত্বপূর্ণ। নীচে দেখুন ।
এভেজেনি সার্জিভ

6
টুরিংয়ের আসল বক্তব্যটি ("চুক্তিগুলির অনেক আগে") ছিল, যখন প্রোগ্রামাররা কীভাবে সঠিক প্রোগ্রাম তৈরির ক্ষেত্রে বরং ভয়ঙ্কর কাজটি মোকাবেলা করতে পারে সে সম্পর্কে প্রাথমিকতম একটি কাগজ লিখেছিলেন। সেই কাগজটি সন্ধান করা পাঠকের পক্ষে অনুশীলন হিসাবে বাকী রয়েছে, যেহেতু সমস্ত প্রোগ্রামাররা তার কাজের সাথে পরিচিত হয়ে উপকৃত হতে পারে। :-) turingarchive.org
রন বার্ক

17

ডক্স থেকে:

Assert statements are a convenient way to insert debugging assertions into a program

এখানে আপনি আরও পড়তে পারেন: http://docs.python.org/re कृपया / 2.5.2 / ref / assert.html


আমি এই মন্তব্যটি পছন্দ করি কারণ এটি কেবল এটি খুব স্পষ্টভাবে কী তা ব্যাখ্যা করে। আমার প্রশ্নটি "যদি আমি একটি যথাযথ ইউনিট পরীক্ষা লিখি তবে আমার কেন দৃ an়তার প্রয়োজন হবে"? যে স্টাফ যাইহোক উত্পাদন উত্পাদন হয় না।
dtc

17

দাবী বিবৃতিতে দুটি রূপ রয়েছে।

সরল রূপটি, এর assert <expression>সমতুল্য

if __debug__:
    if not <expression>: raise AssertionError

বর্ধিত ফর্ম, এর assert <expression1>, <expression2>সমতুল্য

if __debug__:
    if not <expression1>: raise AssertionError, <expression2>

16

বাগগুলি ধরার লক্ষ্য নিয়ে প্রোগ্রামারের প্রত্যাশার মতো কোনও প্রোগ্রামের অভ্যন্তরীণ অবস্থা যেমন রয়েছে তা যাচাই করার জন্য জোর দেওয়া পদ্ধতিগত উপায়। নীচে উদাহরণ দেখুন।

>>> 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!
>>> 

1
এছাড়াও, যুক্তিগুলি প্রায়শই ইউনিট টেস্টিং প্রোগ্রামগুলিতে ব্যবহার করা যেতে পারে। stackoverflow.com/questions/1383/what-is-unit-testing
panofish

7

এখানে একটি সরল উদাহরণ রয়েছে, এটি ফাইলটিতে সংরক্ষণ করুন (আসুন বি.পি. বলুন)

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

6

যদি জোয়ারের পরে বক্তব্যটি সত্য হয় তবে প্রোগ্রামটি অব্যাহত থাকে, তবে যদি দৃ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

4

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হ'ল অনুষ্ঠানগুলি যখন প্রোগ্রামটি একটি শর্ত যাচাই করে এবং ত্রুটিকে অতিক্রম করার বিকল্প বিকল্প গ্রহণ না করে প্রোগ্রামটি তত্ক্ষণাত বন্ধ করা উচিত:

1. প্যারেন্টেসিস

আপনি যেমন খেয়াল করেছেন, 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.optimize1 ( True) তে সেট করা আছে ;

* এবং, __debug__সেট করা আছে False;

মান 2: আরও একটি জিনিস অক্ষম করে

* ডকস্টরিংগুলি অক্ষম করা হয়েছে;

সুতরাং, assertএক ধরণের প্রত্যাশিত ডেটা বৈধকরণের জন্য বিবৃতিটি ব্যবহার করা অত্যন্ত বিপজ্জনক, এমনকি কিছু সুরক্ষা ইস্যুতেও বোঝায়। তারপরে, আপনার যদি কিছু অনুমতি যাচাই করার দরকার হয় তবে আমি raise AuthErrorতার পরিবর্তে আপনাকে সুপারিশ করব । পূর্বশর্ত কার্যকর হিসাবে, assertসাধারণত গ্রন্থাগার বা মডিউলগুলিতে প্রোগ্রামাররা ব্যবহার করেন যা ব্যবহারকারীদের সরাসরি যোগাযোগ করে না।


3

সি 2 উইকির সংক্ষিপ্তসার হিসাবে :

একটি প্রোগ্রামের একটি নির্দিষ্ট পয়েন্টে একটি দৃser়তা বুলিয়ান এক্সপ্রেশন যা প্রোগ্রামে কোনও বাগ না থাকলে সত্য হবে unless

আপনি assertকোনও নির্দিষ্ট প্রোগ্রাম পয়েন্টে কোডটি বোঝার জন্য দলিল করতে একটি বিবৃতি ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি ইনপুট (পূর্বশর্ত), প্রোগ্রামের অবস্থা (আক্রমণকারী), অথবা আউটপুট (পোস্টকন্ডিশন) সম্পর্কে অনুমান বা গ্যারান্টি নথিভুক্ত করতে পারেন।

যদি আপনার দৃ .় বক্তব্য কখনও ব্যর্থ হয়, এটি আপনার (বা আপনার উত্তরসূরি) জন্য সতর্কতা যে আপনি যখন প্রোগ্রামটি লিখেছিলেন তখন আপনার বোঝাপড়াটি ভুল ছিল এবং সম্ভবত এটিতে একটি ত্রুটি রয়েছে।

আরো তথ্যের জন্য, জন Regehr উপর একটা চমৎকার ব্লগ পোস্টে আছে গবেষকেরা ব্যবহারের , পাইথন যা প্রযোজ্য assertপাশাপাশি বিবৃতি।


2

আপনি যদি কখনও জানতে চান যে কোনও সংরক্ষিত ফাংশন অজগরটিতে ঠিক কী করে, তবে টাইপ করুন help(enter_keyword)

আপনি যদি কোনও সংরক্ষিত কীওয়ার্ড প্রবেশ করিয়ে থাকেন যা আপনি এটি একটি স্ট্রিং হিসাবে প্রবেশ করেছেন তা নিশ্চিত করুন।


2

পাইথন দৃ sert ়ভাবে মূলত একটি ডিবাগিং সহায়তা যা আপনার কোডের অভ্যন্তরীণ স্ব-পরীক্ষার জন্য শর্ত পরীক্ষা করে। যখন আপনার কোডটি অসম্ভব প্রান্তের ক্ষেত্রে পরিণত হয় তখন ডিগ্রিটি ডিবাগিংটি সত্যই সহজ করে তোলে। এই অসম্ভব কেসগুলি পরীক্ষা করে দেখুন।

আসুন ধরা যাক ছাড়ের পরে আইটেমের দাম গণনা করার জন্য একটি ফাংশন রয়েছে:

def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price

এখানে, ছাড়যুক্ত_প্রাইস কখনই 0 এর চেয়ে কম এবং প্রকৃত দামের চেয়ে বেশি হতে পারে না। সুতরাং, যদি উপরের শর্তটি লঙ্ঘিত হয় তবে দৃ .়তা একটি দৃ Error় ত্রুটি উত্থাপন করে, যা বিকাশকারীকে সনাক্ত করতে পারে যে অসম্ভব কিছু ঘটেছে।

আশা করি এটা সাহায্য করবে :)


2
assertডিবাগিং প্রসঙ্গে দরকারী, তবে কোনও ডিবাগিং প্রসঙ্গে বাইরে নির্ভর করা উচিত নয়।
ফ্লাক্সএক্স

2

আমার সংক্ষিপ্ত ব্যাখ্যাটি হ'ল:

  • 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দরকারী হবে।
ফ্লাক্সএক্স

1

পাইচার্মে, আপনি যদি কোনও সামগ্রীর প্রকার ঘোষণা করার 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

0

অন্যান্য উত্তরে লিখিত হিসাবে, 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োকালেন , আমরা আশা করতে পারি যে আপনি প্রোগ্রামের মানের উন্নতি করেছেন কারণ ভুল যুক্তি, ভুল ফেরত মান, একটি শ্রেণীর ভুল অবস্থার ... রিপোর্ট করা হবে।


-2

বিন্যাস: দৃ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!    

-2
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

পরামিতিগুলি ফাংশন কলটিতে পাস হয়েছে তা নিশ্চিত করতে ব্যবহার করা যেতে পারে।


1
এটি কাজ করবে, তবে যা আমি বুঝতে পেরেছি সেগুলি থেকে ব্যবহারকারী-ইনপুট পরীক্ষা করার জন্য জোর দেওয়া উচিত নয়, কারণ রান-টাইমে এগুলি বন্ধ করা যায়। আপনি যদি সত্যই ব্যবহারকারীর ইনপুটটিকে কার্যকর করতে বা বৈধ করতে চান তবে if not user_key: raise ValueError()এখানে শেষ 2 টি অনুচ্ছেদটি দেখুন: উইকি.পাইথন.আর.উমিন
ব্যবহারের নিবন্ধগুলি

assertইনপুট যাচাইকরণের জন্য ব্যবহার করা উচিত নয় কারণ পারেন বৈধতা আউট ছিনতাই করা হবে যদি __debug__হয় False। অ-ডিবাগ উদ্দেশ্যে নয় এমন দৃ .়তা হিসাবে ব্যবহারের ফলে লোকেরা ফলাফলগুলি ধরে ফেলতে পারে AssertionError, যা কম পরিবর্তে ডিবাগিংকে আরও কঠিন করে তুলতে পারে।
ফ্লাক্সএক্স

-4
>>>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
>>> 

-4

মূলত আসর্ট কীওয়ার্ডের অর্থ হ'ল যদি শর্তটি সত্য না হয় তবে এটি একটি এসেন্সারঅররের মাধ্যমে অন্যথায় এটি অজগর হিসাবে উদাহরণস্বরূপ অব্যাহত থাকে।

কোড-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

2
আপনার কোডটি সঠিকভাবে ফর্ম্যাট করুন। এছাড়াও, পূর্ববর্তী উত্তরে কীভাবে এটি উন্নতি হয়?
c2huc2hu

আমার ব্যাখ্যাতে কোন সমস্যা আছে?
ujjwal_bansal

আপনার ব্যাখ্যাটি বিদ্যমান উত্তরের সাথে কিছু যুক্ত করে না, এবং দরিদ্র ব্যাকরণ এটি পড়া শক্ত করে তোলে। যদি আপনি উত্তরগুলির জন্য প্রশ্নের সন্ধান করেন তবে নতুন প্রশ্ন ফিড ব্রাউজ করার বিষয়টি বিবেচনা করুন।
c2huc2hu

প্রদত্ত উত্তরটি কীভাবে ব্যবহার করতে হবে তার উত্তর দেয় assertতবে কখন ব্যবহার করতে হয় (বা ব্যবহার না করে) উত্তর দেয় না assert
ফ্লাক্সএক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.