You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lessons/l24.rst
+113Lines changed: 113 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -484,6 +484,119 @@ Warnings Filter
484
484
دستور ``assert``
485
485
~~~~~~~~~~~~~~~~~~~~~~~~~~~
486
486
487
+
ادعا یا Assertion در برنامهنویسی به عبارتهای ساده از شرطهای بولی گفته میشود که درستی یک «وضعیت» یا یک «حقیقت» در کد را بررسی میکنند. باید توجه داشت Assertion در واقع یک ابزار برای کمک به توسعه برنامه میباشد که کاربرد آن در ایجاد تست کد در زمان تستنویسی و دیباگ (Debug) برنامه در محیط توسعه میباشد و نه در محیط اجرای برنامه به عنوان محصول.
: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
+
defaverage(numbers):
513
+
assertlen(numbers) !=0
514
+
returnsum(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
+
defaverage(numbers):
545
+
assertlen(numbers) !=0, 'List[numbers] is empty.'
546
+
returnsum(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
+
defaverage(numbers):
585
+
assertlen(numbers) !=0, 'List[numbers] is empty.'
586
+
returnsum(numbers)/len(numbers)
587
+
588
+
try:
589
+
590
+
numbers = []
591
+
print(f'Average of {numbers}: {average(numbers)}')
0 commit comments