Answers:
මෙම assert
ප්රකාශය වැඩසටහන් සෑම භාෂා පවතී. එය ඔබගේ වැඩසටහනේ මුල් අවදියේදී ගැටළු හඳුනා ගැනීමට උපකාරී වේ, හේතුව පැහැදිලි වන අතර පසුව වෙනත් මෙහෙයුමක අතුරු as ලයක් ලෙස නොව.
ඔබ කරන විට ...
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
ප්රකාශයන්ට විකල්ප පණිවිඩයක් ඇතුළත් කළ හැකි අතර, පරිවර්තකය ක්රියාත්මක කිරීමේදී ඔබට ඒවා අක්රිය කළ හැකිය.
ප්රකාශය අසමත් වුවහොත් පණිවිඩයක් මුද්රණය කිරීම සඳහා:
assert False, "Oh no! This assertion failed!"
එපා නොවන ඇමතුම් සඳහා වරහන භාවිතා assert
උත්සවයකට වගේ. එය ප්රකාශයකි. ඔබ එසේ කළහොත් ඔබ පළමු පරාමිතිය ලෙස ටුපල් සමඟ assert(condition, message)
ධාවනය කරනු assert
ඇත (condition, message)
.
ක්රියාත්මක වන විට, ඔවුන් අක්රිය කිරීමේ ලෙස python
එහිදී දැන කෙලෙසුන් කෙරෙන් ආකාරය, __debug__
ඇත False
, අණසක පැතිරීමට ප්රකාශ නොසලකා හරිනු ලැබේ. -O
ධජය පසුකර යන්න :
python -O script.py
අදාළ ලියකියවිලි සඳහා මෙහි බලන්න .
if not condition: raise AssertError()
කළ යුත්තේ ඇයි? කෙටි if not condition
ප්රකාශයක් කිරීම හැරෙන්නට වඩා හොඳ ප්රකාශයක් වඩා හොඳද ?
if
). වැඩි විස්තර සඳහා
assert
නමුත්, සියලු පිළිතුරු කියවීමෙන් පසු, මම මුළුමනින් ම මට ඕන දෙයක් ගත්තා!
වරහන් සඳහා අවධානයෙන් සිටින්න. ලෙස, ඉහත පෙන්වා දී ඇති python, 3, assert
ප්රකාශයක් තවමත් ඒ සමඟ සාම්යයක්, print(..)
එක් කිරීම සඳහා එම extrapolate හැක 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"
ක්රියා නොකරනු ඇත ... නමුත් එය ස්ථිර ප්රකාශය සමග කිසිදු සම්බන්ධයක් නැත, එය හොඳයි. එය කොන්දේසියක් නොවන නිසා ඔබේ තත්වය ක්රියාත්මක නොවේ. තත්පරයක් අතුරුදහන් =
.
වෙනත් පිළිතුරු සටහන් කර ඇති පරිදි, assert
දී ඇති කොන්දේසියක් සත්ය නොවේ නම් ව්යතිරේකයක් විසි කිරීමට සමාන වේ. වැදගත් වෙනසක් නම්, ඔබ ඔබේ කේතය ප්රශස්තිකරණ විකල්පය සමඟ සම්පාදනය කරන්නේ නම් ප්රකාශ ප්රකාශ නොසලකා හරිනු -O
ඇත. මෙම ප්රලේඛනය පවසයි assert expression
වඩා හොඳ සමාන ලෙස විස්තර කළ හැකි ය
if __debug__:
if not expression: raise AssertionError
ඔබේ කේතය තරයේ පරීක්ෂා කිරීමට අවශ්ය නම් මෙය ප්රයෝජනවත් විය හැකි අතර, ඔබේ ප්රකාශ කිරීමේ සිද්ධීන් කිසිවක් අසමත් වීම ගැන ඔබ සතුටු වන විට ප්රශස්තිකරණය කළ අනුවාදයක් නිකුත් කරන්න - ප්රශස්තිකරණය ක්රියාත්මක වන විට __debug__
විචල්යය අසත්ය බවට පත්වන අතර කොන්දේසි ඇගයීම නවත්වනු ඇත. ඔබ ප්රකාශයන් මත විශ්වාසය තබා ඒවා අතුරුදහන් වී ඇති බව නොදැන සිටියහොත් මෙම අංගයටද ඔබව හසු කර ගත හැකිය.
if Not Error: raise Exception(“ this is a error”)
යුතුද? එමගින්, පරිශීලකයා එය ක්රියාත්මක කරන විට දෝෂයේ ප්රභවය වැඩසටහන මඟින් පෙන්වනු ඇත ..
assert
ප්රකාශය භාවිතා කළ යුතුද? මෙහි උපකල්පනය නම්, වැඩසටහන අවසාන පරිශීලකයා වෙත මුදා හරින විට, ඔබ -O ධජය භාවිතා කරන අතර එමඟින් සියලු දෝෂ ඉවත් කර ඇති බව උපකල්පනය කරයි. එබැවින්, කිසියම් දෝෂයක් හෝ වැඩසටහන් බිඳවැටීමක් සිදුවන්නේ කොන්ත්රාත්තුවට අනුව වලංගු වන වැඩසටහනට ආදානය කිරීම නිසාය, නමුත් වැඩසටහන මඟින් එය හැසිරවිය නොහැක. එබැවින් එය පරිශීලකයා දැනුවත් කළ යුතුය.
පයිතන්හි ප්රකාශයක පරමාර්ථය වන්නේ වැඩසටහනක සොයාගත නොහැකි දෝෂ පිළිබඳව සංවර්ධකයින් දැනුවත් කිරීමයි.
පරිශීලකයාට නිවැරදි කිරීමේ ක්රියාමාර්ගයක් ගත හැකි (හෝ නැවත උත්සාහ කරන්න) “ගොනුව හමු නොවීය” වැනි අපේක්ෂිත දෝෂ තත්වයන් සං signal ා කිරීමට ප්රකාශයන් අදහස් නොකෙරේ.
එය බැලීමට තවත් ක්රමයක් නම්, ඔබේ කේතයේ අභ්යන්තර ස්වයං පරීක්ෂාවන් බව ප්රකාශ කිරීමයි. ඔබේ කේතයේ සමහර කොන්දේසි කළ නොහැකි යැයි ප්රකාශ කිරීමෙන් ඒවා ක්රියාත්මක වේ. මෙම කොන්දේසි නොපවතින්නේ නම් එයින් අදහස් වන්නේ වැඩසටහනේ දෝෂයක් ඇති බවයි.
ඔබේ වැඩසටහන දෝෂ රහිත නම්, මෙම තත්වයන් කිසි විටෙකත් සිදු නොවේ. එහෙත් ඉන් එකක් නම් කරන්නේ මෙම වැඩසටහන සිදුවේ "නොහැකි" තත්ත්වයේ අවුලුවන ලද හරියටම කියනවා ඔබට, ප්රකාශයකින් දෝෂය සමඟ ඇති වනවා. මෙය ඔබගේ වැඩසටහන් වල දෝෂ සොයා ගැනීමට සහ නිවැරදි කිරීමට පහසු කරයි.
මෙන්න මම ලියූ පයිතන්ගේ ප්රකාශයන් පිළිබඳ නිබන්ධනයක සාරාංශයක් :
පයිතන්ගේ ප්රකාශ ප්රකාශය නිදොස් කිරීමේ ආධාරකයක් මිස ධාවන කාල දෝෂ හැසිරවීමේ යාන්ත්රණයක් නොවේ. ප්රකාශයන් භාවිතා කිරීමේ පරමාර්ථය වන්නේ දෝෂයකට මුල් හේතුව සොයා ගැනීමට සංවර්ධකයින්ට ඉඩ දීමයි. ඔබේ වැඩසටහනේ දෝෂයක් නොමැති නම් කිසි විටෙකත් ප්රකාශ කිරීමේ දෝෂයක් මතු නොවිය යුතුය.
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:
පළමු ප්රකාශය කිසිවක් නොකරන අතර දෙවැන්න ව්යතිරේකයක් මතු කරයි. මෙය පළමු ඉඟියයි: ඔබේ කේතයේ දී ඇති ස්ථානයක (සාමාන්යයෙන්, ආරම්භය (පූර්ව කොන්දේසි) සහ ශ්රිතයක අවසානය (පසු කොන්දේසි)) සත්ය විය යුතු කොන්දේසි පරීක්ෂා කිරීමට ප්රකාශයන් ප්රයෝජනවත් වේ.
කොන්ත්රාත්තු මගින් වැඩසටහන්කරණය සමඟ සැබවින්ම බැඳී ඇති අතර එය ඉතා ප්රයෝජනවත් ඉංජිනේරු භාවිතයකි:
ලියකියවිලි වලින්:
ප්රකාශය යනු නිදොස් කිරීමේ ප්රකාශයන් වැඩසටහනකට ඇතුළත් කිරීමට පහසු ක්රමයකි
ඔබට මෙහි වැඩිදුර කියවිය හැකිය: http://docs.python.org/release/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!
>>>
මෙන්න සරල උදාහරණයක්, මෙය ගොනුවේ සුරකින්න (b.py යැයි කියමු)
def chkassert(num):
assert type(num) == int
chkassert('a')
සහ ප්රති result ලය කවදාද $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
තහවුරු කිරීමෙන් පසු ප්රකාශය සත්ය නම් වැඩසටහන දිගටම පවතී, නමුත් ප්රකාශ කිරීමෙන් පසු ප්රකාශය අසත්ය නම් වැඩසටහන දෝෂයක් ලබා දෙයි. ඒ තරම් සරළයි.
උදා:
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
ප්රකාශය වැඩසටහන් සෑම භාෂා පවතී. එය ඔබගේ වැඩසටහනේ මුල් අවදියේදී ගැටළු හඳුනා ගැනීමට උපකාරී වේ, හේතුව පැහැදිලි වන අතර පසුව වෙනත් මෙහෙයුමක අතුරු as ලයක් ලෙස නොව. ඔවුන් සෑම විටම True
කොන්දේසියක් අපේක්ෂා කරයි .
ඔබ එවැනි දෙයක් කරන විට:
assert condition
ඔබ වැඩසටහනට පවසන්නේ එම තත්වය පරීක්ෂා කර එය වැරදියි නම් වහාම දෝෂයක් ඇති කරන ලෙසයි.
පයිතන්හි assert
ප්රකාශනය සමාන වේ:
if __debug__:
if not <expression>: raise AssertionError
විකල්ප පණිවිඩයක් යැවීමට ඔබට දීර් expression ප්රකාශනය භාවිතා කළ හැකිය :
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
ප්රකාශය කොන්දේසි දෙකක් භාවිතා කරයි. ඒ නිසා, නෑ නෑ පැහැදිලි උපදෙස් සඳහා එක් ලෙස englobe කිරීමට වරහන් භාවිතා කරන්න. ඔබ එවැනි දෙයක් කරන්නේ නම්:
assert (condition, message)
උදාහරණයක්:
>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
ඔබ ධාවනය කරනු ඇත assert
සමඟ (condition, message)
පළමු පරාමිතිය ලෙස tuple නියෝජනය කරන අතර, මෙය සිදු Python දී, හිස්-නොවන tuple වේ හේතුව වන සෑම විටම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
මෙම ප්රකාශය සමග Python ඇරඹෙන දා පත් කළ හැකිය නිසා දත්ත සකසන හෝ දත්ත වලංගුකරණය ක්රියාත්මක කිරීමට ප්රකාශයක් -O
හෝ -OO
අර්ථය අගය 1, 2, 0 (පෙරනිමි ලෙස), පිළිවෙළින් - - හෝ ධජය PYTHONOPTIMIZE
පරිසර විචල්ය .
අගය 1:
* ප්රකාශ අක්රීය කර ඇත;
* බයිට් කේත ගොනු ජනනය කරනුයේ .pyo
ඒ වෙනුවට දිගුව භාවිතා කරමිනි .pyc
;
* sys.flags.optimize
1 ( True
) ලෙස සකසා ඇත ;
* සහ, __debug__
ලෙස සකසා ඇත False
;
අගය 2: තවත් එක් දෙයක් අක්රීය කරයි
* docstrings අක්රීය කර ඇත;
එබැවින්, assert
අපේක්ෂිත දත්ත වර්ගයක් වලංගු කිරීම සඳහා ප්රකාශය භාවිතා කිරීම අතිශයින්ම භයානක වන අතර එය සමහර ආරක්ෂක ගැටළු වලට පවා ඇඟවුම් කරයි. ඔබට යම් අවසරයක් වලංගු කිරීමට අවශ්ය නම් raise AuthError
ඒ වෙනුවට මම ඔබට නිර්දේශ කරමි . පූර්ව කොන්දේසි සහිත effective ලදායී ලෙස, assert
පරිශීලකයෙකු සෘජුවම අන්තර්ක්රියා නොකරන පුස්තකාල හෝ මොඩියුලවල ක්රමලේඛකයින් විසින් බහුලව භාවිතා කරයි.
සී 2 විකියෙහි සංක්ෂිප්තව සාරාංශගත කර ඇති පරිදි :
ප්රකාශයක් යනු වැඩසටහනක නිශ්චිත අවස්ථාවක දී බූලියන් ප්රකාශනයක් වන අතර එය වැඩසටහනේ දෝෂයක් නොමැති නම් සත්ය වේ.
assert
විශේෂිත වැඩසටහන් ස්ථානයක කේතය පිළිබඳ ඔබේ අවබෝධය ලේඛනගත කිරීමට ඔබට ප්රකාශයක් භාවිතා කළ හැකිය . උදාහරණයක් ලෙස, ඔබට යෙදවුම් (පූර්ව කොන්දේසි), වැඩසටහන් තත්වය (වෙනස්වීම්) හෝ ප්රතිදානයන් (පසු කොන්දේසි) පිළිබඳ උපකල්පන හෝ සහතික කිරීම් ලේඛනගත කළ හැකිය.
ඔබේ ප්රකාශය කවදා හෝ අසාර්ථක වුවහොත්, මෙය ඔබ (හෝ ඔබේ අනුප්රාප්තිකයා) සඳහා වූ අනතුරු ඇඟවීමකි, ඔබ එය ලියන විට වැඩසටහන පිළිබඳ ඔබේ අවබෝධය වැරදියි, සහ එහි දෝෂයක් ඇති බව.
වැඩි විස්තර සඳහා, ජෝන් Regehr මත අපූරු බ්ලොග් ඇත කථනයන් භාවිතය සඳහා python අදාළ වන assert
මෙන්ම ප්රකාශයක්.
Python මීට උදාහරණ අණසක පැතිරීමට මූලික වශයෙන් ඔබගේ කේතය අභ්යන්තර ස්වයං-චෙක් සඳහා දෝෂහරණ ආධාර වන ටෙස්ට් තත්ත්වය වේ. ඔබේ කේතය කළ නොහැකි අද්දරට වැටෙන විට තහවුරු කිරීම නිදොස් කිරීම සැබවින්ම පහසු කරයි. කළ නොහැකි අවස්ථා පරීක්ෂා කරන්න.
වට්ටම් ලැබීමෙන් පසු අයිතමයේ මිල ගණනය කිරීමේ කාර්යයක් ඇති බව කියමු:
def calculate_discount(price, discount):
discounted_price = price - [discount*price]
assert 0 <= discounted_price <= price
return discounted_price
මෙහි, වට්ටම්_ප්රයිස් කිසි විටෙකත් 0 ට වඩා අඩු විය නොහැකි අතර සැබෑ මිලට වඩා වැඩි විය හැකිය. එබැවින්, ඉහත කොන්දේසිය උල්ලං is නය වී ඇත්නම්, ප්රකාශය මඟින් දෝෂයක් මතු කරයි, එය කළ නොහැකි දෙයක් සිදුවී ඇති බව හඳුනා ගැනීමට සංවර්ධකයාට උපකාරී වේ.
එය උපකාරී වේ යැයි සිතමි :)
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
ප්රයෝජනවත් වනු ඇත.
Pycharm දී, ඔබ භාවිතා කරන්නේ නම් 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
ප්රකාශ වැඩසටහනක් එකතුකරන්න ප්රයෝජනවත් වේ, නමුත් පරිශීලක ආදාන පරීක්ෂා කිරීමට ද සිතමි. මම පහත දැක්වෙන නියමය භාවිතා කරමි: මෙය සිදු නොවිය යුතු තත්වයක් හඳුනා ගැනීමට ප්රකාශයන් තබා ගන්න . පරිශීලක ආදානය වැරදියි, උදා: මුරපදය ඉතා කෙටි නමුත් මෙය මෙය සිදු නොවිය යුතුය . රවුමක විෂ්කම්භය එහි අරය මෙන් දෙගුණයක් විශාල නොවේ නම්, ඔබ සිටින්නේ මෙය සිදු නොවිය යුතුය .
වඩාත් රසවත්, මගේ සිතේ, භාවිතය assert
විසින් දේවානුභාවයෙන් දුන්
කොන්ත්රාත්තුව වැඩසටහන් [වස්තූන්-පිණිසයි මෘදුකාංග ඉදිකිරීම්] දී බී මේයර් එකිනෙකාගෙන් විසින් විස්තර කර ඇති පරිදි (
https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction% 2C_2nd_Edition
) සහ [අයිෆල් ක්රමලේඛන භාෂාවෙන්] (
https://en.wikipedia.org/wiki/Eiffel_(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
, නමුත් එය එසේ නොවේ) .
ලැයිස්තුව හිස් නොවේ නම්, කාර්යයන් දෙකම එකම ප්රති result ලයක් ඇති අතර මෙම ප්රති result ලය නිවැරදි ය:
>>> 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))
සමහර විස්මයන් වළක්වා ගැනීම සඳහා, මම කිසියම් අනපේක්ෂිත තර්කයක් ශ්රිතයකට යොමු කරන විට දැන ගැනීමට කැමතියි. වෙනත් වචන වලින් කිවහොත්: නිරීක්ෂණය කළ හැකි හැසිරීම විශ්වාසදායක නොවන විට මම දැන ගැනීමට කැමතියි, මන්ද එය ක්රියාත්මක කිරීම මත රඳා පවතී, පිරිවිතර මත නොවේ. ඇත්ත වශයෙන්ම, මට පිරිවිතර කියවිය හැකිය, නමුත් ක්රමලේඛකයින් සෑම විටම ලේඛය හොඳින් කියවන්නේ නැත.
පහත දැක්වෙන ප්රති get ල ලබා ගැනීම සඳහා කේතයට පිරිවිතර ඇතුළත් කිරීමට මට ක්රමයක් තිබේදැයි සිතා බලන්න: මම පිරිවිතර උල්ලං When නය කරන විට, උදා: හිස් ලැයිස්තුවක් යැවීමෙන් 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
වන්නේ කිසියම් ධාවන කාල දෝෂයක් නොවන බැවිනි : එය පිරිවිතර උල්ලං violation නය කිරීමක් සං als ා කරයි. මට අනතුරු ඇඟවීමක් අවශ්ය නමුත් මට දෝෂයක් ඇතිවිය. වාසනාවකට මෙන්, මට චෙක්පත අක්රීය කළ හැකිය ( -O
විකල්පය භාවිතා කරමින් ), නමුත් මගේම අවදානමක. කඩාවැටීම සැබවින්ම මිල අධික වන අතර හොඳම දේ ගැන බලාපොරොත්තු වෙමි. මගේ වැඩසටහන කළු කුහරයක් හරහා ගමන් කරන අභ්යවකාශ යානයක කාවැදී ඇතැයි සිතන්න. මම ප්රකාශයන් අක්රීය කර, හැකි තාක් කල් බිඳ වැටීමට නොහැකි තරමට වැඩසටහන ශක්තිමත් යැයි සිතමි.
මෙම උදාහරණය පූර්ව කොන්දේසි ගැන පමණි, ඔබට assert
පශ්චාත් කොන්දේසි (ප්රතිලාභ අගය සහ / හෝ රාජ්යය) සහ ආක්රමණ (පන්තියක තත්වය) පරීක්ෂා කිරීමට භාවිතා කළ හැකිය . පසු කොන්දේසි සහ වෙනස්වීම් පරීක්ෂා කිරීම assert
කරදරකාරී විය හැකි බව සලකන්න:
ඔබට අයිෆල් තරම් නවීන දෙයක් නොමැත, නමුත් ඔබට කෙසේ වෙතත් වැඩසටහනක සමස්ත ගුණාත්මකභාවය වැඩි දියුණු කළ හැකිය.
සාරාංශගත කිරීම සඳහා, මෙම assert
ප්රකාශය මෙය සිදු නොවිය යුතු තත්වයක් හඳුනා ගැනීමට පහසු ක්රමයකි . පිරිවිතර උල්ලං lations නය කිරීම් (උදා: හිස් ලැයිස්තුවක් වෙත යැවීම head
) පළමු පන්තිය වන අතර මෙය සිදුවිය යුතු නොවේ . එබැවින්, assert
කිසියම් අනපේක්ෂිත තත්වයක් හඳුනා ගැනීම සඳහා ප්රකාශය භාවිතා කළ හැකි වුවද, පිරිවිතරයන් සපුරා ඇති බව සහතික කිරීම වරප්රසාදිත ක්රමයකි. assert
පිරිවිතරයන් නිරූපණය කිරීම සඳහා ඔබ කේතයට ප්රකාශ ඇතුළත් කළ පසු, ඔබ වැඩසටහනේ ගුණාත්මක භාවය වැඩි දියුණු කර ඇතැයි අපට විශ්වාස කළ හැකිය, මන්ද වැරදි තර්ක, වැරදි ප්රතිලාභ අගයන්, පන්තියක වැරදි තත්වයන් ..., වාර්තා වනු ඇත.
ආකෘතිය: assert Expression [, තර්ක] ප්රකාශයක් ප්රකාශ කළ විට, පයිතන් ප්රකාශනය ඇගයීමට ලක් කරයි. ප්රකාශය සත්ය නොවේ නම්, ව්යතිරේකයක් මතු වේ (assertionError). ප්රකාශය අසමත් වුවහොත්, පයිතන් විසින් තර්කය ලෙස තර්කය ලෙස ArgumentExpression භාවිතා කරයි. උත්සාහය හැර ප්රකාශය භාවිතා කරමින් වෙනත් ව්යතිරේකයක් මෙන් තහවුරු කිරීම් දෝෂ ව්යතිරේකයන් හසු කර ගත හැකි නමුත් ඒවා හසුරුවන්නේ නැත්නම්, ඔවුන් වැඩසටහන අවසන් කර හෝඩුවාවක් නිපදවනු ඇත. උදාහරණයක්:
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)
ඉහත කේතය ක්රියාත්මක කළ විට, එය පහත ප්රති result ලය ලබා දෙයි:
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 පරීක්ෂා කරන්න: wiki.python.org/moin/UsingAssertionsEffectively
assert
ආදාන වලංගු කිරීම සඳහා භාවිතා නොකළ යුතුය, මන්ද එසේ නම් වලංගු කිරීම ඉවත් කරනු __debug__
ලැබේ False
. දෝශ නිරාකරණ නොවන අරමුණු සඳහා ප්රකාශ භාවිතා කිරීමෙන් මිනිසුන්ට එහි ප්රති AssertionError
s ල අල්ලා ගැනීමට හැකි වන අතර එමඟින් අඩු කිරීම වෙනුවට නිදොස් කිරීම වඩාත් අපහසු වේ.
>>>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
.