Skip to content

Commit e113a23

Browse files
author
Saeid Darvish
committed
l24: asert, compeleted
1 parent d3edfc8 commit e113a23

2 files changed

Lines changed: 113 additions & 0 deletions

File tree

28.8 KB
Loading

lessons/l24.rst

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,119 @@ Warnings Filter
484484
دستور ``assert``
485485
~~~~~~~~~~~~~~~~~~~~~~~~~~~
486486

487+
ادعا یا Assertion در برنامه‌نویسی به عبارت‌های ساده از شرط‌های بولی گفته می‌شود که درستی یک «وضعیت» یا یک «حقیقت» در کد را بررسی می‌کنند. باید توجه داشت Assertion در واقع یک ابزار برای کمک به توسعه برنامه می‌باشد که کاربرد آن در ایجاد تست کد در زمان تست‌نویسی و دیباگ (Debug) برنامه در محیط توسعه می‌باشد و نه در محیط اجرای برنامه به عنوان محصول.
488+
489+
490+
فلوچارت یک Assertion به صورت زیر ترسیم می‌شود:
491+
492+
.. image:: /_static/l24-python-assertion-flowchart.png
493+
:align: center
494+
:width: 450
495+
:alt: دستور ``assert`` در پایتون - فلوچارت Assertion
496+
497+
498+
در زبان برنامه‌نویسی پایتون Assertion با استفاده از دستور ``assert`` پیاده‌سازی می‌گردد [`اسناد پایتون <https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement>`__] و با یکی از دو سینتکس زیر قابل پیاده‌سازی می‌باشد::
499+
500+
assert condition_expression
501+
502+
::
503+
504+
assert condition_expression, 'error_message'
505+
506+
507+
به نمونه کد زیر توجه نمایید:
508+
509+
.. code-block:: python
510+
:linenos:
511+
512+
def average(numbers):
513+
assert len(numbers) != 0
514+
return sum(numbers)/len(numbers)
515+
516+
numbers = [1, 2, 3, 4, 5]
517+
print(f'Average of {numbers}: {average(numbers)}')
518+
519+
print('-' * 30)
520+
521+
numbers = []
522+
print(f'Average of {numbers}: {average(numbers)}')
523+
524+
::
525+
526+
Average of [1, 2, 3, 4, 5]: 3.0
527+
------------------------------
528+
Traceback (most recent call last):
529+
File "sample.py", line 11, in <module>
530+
print(f'Average of {numbers}: {average(numbers)}')
531+
File "sample.py", line 2, in average
532+
assert len(numbers) != 0
533+
AssertionError
534+
535+
536+
فرض توسعه‌دهنده تابع ``average`` مثال قبل این بوده که به این تابع نباید داده‌ای با طول صفر ارسال نمی‌گردد، ولی اگر در زمان تست یا ادامه مراحل توسعه برنامه این مقدار ارسال گردد، باید یک فکری برای اصلاح آن کرد! چرا که این تابع آمادگی تبدیل شدن به یک باگ در برنامه را خواهد داشت.
537+
538+
می‌توان برای دستور ``assert`` یک پیام خطا نیز اختصاص داد:
539+
540+
541+
.. code-block:: python
542+
:linenos:
543+
544+
def average(numbers):
545+
assert len(numbers) != 0, 'List[numbers] is empty.'
546+
return sum(numbers)/len(numbers)
547+
548+
numbers = []
549+
print(f'Average of {numbers}: {average(numbers)}')
550+
551+
::
552+
553+
Traceback (most recent call last):
554+
File "sample.py", line 6, in <module>
555+
print(f'Average of {numbers}: {average(numbers)}')
556+
File "sample.py", line 2, in average
557+
assert len(numbers) != 0, 'List[numbers] is empty.'
558+
AssertionError: List[numbers] is empty.
559+
560+
561+
همانطور پیش‌تر بیان شده دستورهای ``assert`` یک قابلیت برای زمان توسعه می‌باشند بنابراین باید توجه داشت که تمامی این دستورات هنگامی که برنامه با کلید بهینه‌سازی (Optimization - درس چهارم) یعنی ``O-`` یا ``OO-`` اجرا گردد، در زمان کامپیال به بایت‌کد حذف خواهند شد::
562+
563+
$ python -O script.py
564+
565+
566+
این شرایط مشابه حالتی است که بجای دستور ``assert``، مستقیم از دستور ``raise`` به شکل زیر استفاده نماییم::
567+
568+
if __debug__:
569+
if not condition_expression: raise AssertionError()
570+
571+
::
572+
573+
if __debug__:
574+
if not condition_expression: raise AssertionError('error_message')
575+
576+
``__debug__`` یک متغیر داخلی در محیط اجرای پایتون با مقدار پیش‌فرض ``True`` می‌باشد [`اسناد پایتون <https://docs.python.org/3/library/constants.html#__debug__>`__]. مقدار این متغیر در تمام طول مدت اجرای برنامه ثابت خواهد بود و تنها زمانی که برنامه با کلید بهینه‌سازی اجرا گردد، مقدار آن به ``False`` تغییر می‌یابد. بنابراین دستور ``raise AssertionError`` هیچگاه اجرا نخواهد شد.
577+
578+
579+
همچنین نباید فراموش کرد که ``AssertionError`` یکی از Exceptionهای آماده پایتون می‌باشد [`اسناد پایتون <https://docs.python.org/3/library/exceptions.html#AssertionError>`__]. بنابراین هنگام بروز ممکن است توسط دستور ``try``، به صورت ناخواسته handle شود:
580+
581+
.. code-block:: python
582+
:linenos:
583+
584+
def average(numbers):
585+
assert len(numbers) != 0, 'List[numbers] is empty.'
586+
return sum(numbers)/len(numbers)
587+
588+
try:
589+
590+
numbers = []
591+
print(f'Average of {numbers}: {average(numbers)}')
592+
593+
except Exception as err: # or except:
594+
print('Something bad happened!')
595+
596+
::
597+
598+
Something bad happened!
599+
487600

488601

489602
|

0 commit comments

Comments
 (0)