Ачааллж байна...
Түвшин 4-т тавтай морил. Түвшин 3-т бид тест бичиж сурсан бөгөөд тест бол "энд нэг юм буруу байна" гэж хашгирдаг харуул. Гэхдээ харуул хашгирсны дараа хэн нэгэн очиж, яг юу болсныг, хаана, яагаад гэдгийг олох ёстой. Тест унасан, программ буруу тоо гаргасан, хэрэглэгч "миний баримт буруу байна" гэж мэдэгдсэн: эдгээр бүх тохиолдолд алдааг олж засах ажлыг debugging гэдэг. Програмистын ажлын цагийн нэлээд хэсэг яг энэ ажилд зарцуулагддаг бөгөөд үүнийг сайн хийдэг хүн, муу хийдэг хүн хоёрын ялгаа маш том.
Debugging-ийн тухай хамгийн чухал үнэн бол энэ нь ур чадвар бөгөөд арга барилтай. Олон хүн алдаа хайхдаа кодыг ширтэж, "магадгүй энэ байх" гэж санамсаргүй өөрчлөлт хийж, азаа хүлээдэг. Харин туршлагатай хөгжүүлэгч мөрдөгч шиг ажилладаг: нотлох баримт цуглуулж, таамаглал дэвшүүлж, түүнийгээ шалгаж, хайх хүрээгээ алхам бүрт нарийсгадаг. Энэ хичээлд бид тэр аргачлалыг сурна. Дадлагын фолдерт зориуд нуусан алдааг алхам алхмаар олж, хүн бүрийн эхэлдэг print()-ийн аргыг хүндэтгэлтэйгээр, мөн шударгаар судална: яагаад сайн, хаана хүрэлцэхгүй болдог вэ. Энэ хүрэлцээгүй газрууд дараагийн хичээлүүдийн debugger ба logging руу хөтөлнө.
Сайн мөрдөгч хэргийн газар ирээд хамгийн түрүүнд хардаг хүнээ буруутгадаггүй. Тэр эхлээд юу болсныг яг тодорхой мэдэхийг хичээнэ: хэзээ, хаана, ямар нөхцөлд. Дараа нь нотлох баримтыг анхааралтай цуглуулна, ялангуяа бусдын үл тоосон жижиг зүйлсийг. Нотлох баримтаас таамаглал гарч ирнэ: "магадгүй гэрийн үйлчлэгч". Мөрдөгч таамаглалаа баримт гэж үзэхгүй, түүнийг шалгах арга хайна: "хэрвээ үйлчлэгч бол тэр шөнө гэрт байх ёстой байсан, шалгая". Шалгалт таамаглалыг баталвал цааш, үгүйсгэвэл сэжигтнүүдийн жагсаалтаас хасаад дараагийнх руу. Алхам бүрт сэжигтнүүд цөөрч, эцэст нь ганцхан үлдэнэ.
Debugging яг ийм. Хэргийн газар бол таны программ, нотлох баримт бол алдааны мессеж, тестийн тайлан, буруу гарсан тоо. Сэжигтнүүд бол кодын хэсгүүд: аль функц, аль мөр, аль утга. Таамаглал бүр шалгагдах ёстой, шалгалт бүр сэжигтнүүдийг цөөрүүлэх ёстой. Мөрдөгчийн хамгийн том алдаа нь нотлох баримтгүйгээр хэн нэгнийг буруутгах. Програмистын хамгийн том алдаа нь шалгалтгүйгээр кодыг өөрчлөх.
Debugging-ийн аргачлалыг зургаан алхмаар томъёолж болно. Бодит ажилд эдгээр нь заримдаа хурдан, заримдаа бие биетэйгээ холилдон явагддаг ч дараалал нь ерөнхийдөө ийм.
Нэгдүгээрт, давтаж гарга. Алдааг тогтмол гаргаж чадахгүй бол түүнийг засаж байгаа эсэхээ хэзээ ч мэдэхгүй. "Заримдаа буруу гардаг" алдаа бол хамгийн хэцүү алдаа. Алдааг тогтмол гаргадаг хамгийн жижиг нөхцөлийг ол. Хамгийн сайн нь түүнийг унадаг тест болгож бичих: тэгвэл нэг command-аар хүссэн үедээ давтаж, засагдсан эсэхийг шууд мэднэ.
Хоёрдугаарт, нотлох баримтыг бүрэн унш. Алдааны мессеж, traceback, тестийн тайланг 7.4 дүгээр хичээлийн аргаар, доороос нь, мөр бүрийг уншина. Буруу гарсан тоо өөрөө нотлох баримт: тэр нь хүлээгдэж буйгаасаа хэдээр их, бага вэ? Хоёр дахин уу, нэмэгдэл үү, зөвхөн нэг хэсэг үү? Олон алдаа зөвхөн энэ алхмаар л олдогдоно.
Гуравдугаарт, таамаглал дэвшүүл. Нотлох баримтаас тодорхой, шалгагдах таамаглал гарга. "Ямар нэг юм буруу" бол таамаглал биш. "Давталтын нийлбэр зөвхөн сүүлийн барааг тооцож байна" бол таамаглал: үнэн эсвэл худал гэдгийг нь шалгаж болно.
Дөрөвдүгээрт, шалга. Таамаглалыг үнэн бол нэг үр дүн, худал бол өөр үр дүн өгөх ажиглалт зохио: утгыг хэвлэх, нэг функцийг тусад нь дуудах, жижиг тест бичих. Кодыг засахаасаа өмнө таамаглалаа шалга.
Тавдугаарт, хүрээгээ нарийсга. Шалгалт бүр сэжигтнүүдийн тал хувийг хасах ёстой. Хэрвээ өгөгдөл гурван алхмаар дамждаг бол дунд алхам дахь утгыг шалга: тэр зөв бол алдаа дараагийн хагаст, буруу бол өмнөх хагаст. Энэ хагаслах арга хэдэн зуун мөр кодонд ч хэдхэн алхамд алдааг олдог.
Зургаадугаарт, засаад батал. Шалтгааныг олсны дараа шалтгааныг нь зас, шинж тэмдгийг биш. Нэгдүгээр алхмын унадаг тест одоо давах ёстой, бусад бүх тест давсаар байх ёстой. Тэр тест цаашид regression-оос хамгаалах харуул болж үлдэнэ.
Хэргийн газар
VS Code-д pytest-dadlaga фолдероо нээж, venv идэвхтэй эсэхийг шалгаад, үндсэн фолдерт order.py нэртэй шинэ модуль үүсгэнэ үү. Энэ модуль захиалгын нийт дүнг тооцоолох бөгөөд арав ба түүнээс дээш ширхэг авсан бараанд таван хувийн бөөний хөнгөлөлт өгнө.
python
from prices import add_vat
def line_total(price, qty):
total = price * qty
if qty >= 10:
total = total - total * 5 // 100
return total
def order_total(items):
subtotal = 0
for name, price, qty in items:
subtotal = line_total(price, qty)
return add_vat(subtotal)Энэ кодонд зориуд нэг алдаа нуусан. Одоохондоо хайх гэж бүү оролдоорой, бид мөрдөгчийн аргаар олно. tests фолдерт test_order.py үүсгэнэ үү.
python
from order import line_total, order_total
def test_line_total_no_discount():
assert line_total(2000, 2) == 4000
def test_line_total_bulk_discount():
assert line_total(500, 10) == 4750
def test_order_total_single_item():
assert order_total([("талх", 2000, 2)]) == 4400Хүлээгдэж буй утгуудыг шалгая. Хоёр талх 4000, хөнгөлөлтгүй. Арван өндөг 5000, таван хувь нь 250, хөнгөлөлттэй 4750. Нэг мөр захиалга 4000, татвартай 4400.
Command:
pytest tests\test_order.pyГаралт:
collected 3 items
tests\test_order.py ... [100%]
============================== 3 passed in 0.02s ==============================Бүх тест давж байна. Код ажиллаж байгаа мэт харагдаж байна. Тэгсэн ч алдаа бий.
Алхам 1: Давтаж гаргах
Нэгэн хэрэглэгч "хоёр төрлийн бараа авахад баримтын нийт дүн хэт бага гарч байна" гэж мэдэгдсэн гэж бодъё. Энэ бол бүдэг мэдээлэл. Эхний ажил бол алдааг тогтмол гаргадаг жижиг нөхцөлийг олох. Хэрэглэгчийн хэлснийг яг давтъя: хоёр талх, нэг сүү.
Command:
python -c "from order import order_total; print(order_total([('талх', 2000, 2), ('сүү', 3000, 1)]))"Гаралт:
3300Гараар бодъё: хоёр талх 4000, нэг сүү 3000, нийлбэр 7000, татвартай 7700. Программ 3300 гэж хэлж байна. Алдаа давтагдлаа. Одоо түүнийг тест болгож бичье, ингэснээр хүссэн үедээ нэг command-аар давтаж, засагдсан эсэхийг баталгаажуулна. test_order.py-ийн төгсгөлд нэмнэ үү.
python
def test_order_total_two_items():
assert order_total([("талх", 2000, 2), ("сүү", 3000, 1)]) == 7700Command:
pytest tests\test_order.pyГаралт (уналтын хэсэг):
> assert order_total([("талх", 2000, 2), ("сүү", 3000, 1)]) == 7700
E AssertionError: assert 3300 == 7700
E + where 3300 = order_total([('талх', 2000, 2), ('сүү', 3000, 1)])Одоо бидэнд тогтмол, нэг command-аар давтагддаг алдаа бий. Энэ бол debugging-ийн хамгийн чухал алхам бөгөөд олон хүн үүнийг алгасдаг.
Нэг асуулт бас бий: яагаад өмнөх гурван тест энэ алдааг бариагүй вэ? Тэдгээрийн аль нь ч олон бараатай захиалгыг шалгаагүй. test_order_total_single_item нэг мөртэй. 7.1 дүгээр хичээлийн "харуул зөвхөн жагсаалтад байгаа хаалгуудыг шалгадаг" гэсэн үнэний жинхэнэ жишээ: бидний тест хэзээ ч олон мөрийн хаалгыг шалгаагүй байсан.
Алхам 2: Нотлох баримтыг унших
Кодыг нээхээсээ өмнө тоонуудыг анхааралтай хараарай. Хүлээгдэж буй 7700, бодит 3300. 3300 гэдэг тоо санамсаргүй тоо биш. Татварыг хасвал юу үлдэх вэ? 3300 нь 3000-ийн арван хувийг нэмсэн дүн. 3000 гэдэг нь яг сүүний мөрийн дүн. Тоонууд хүчтэй сэжүүр өгч байна: программ сүүг л тооцоолж, талхыг огт тоолоогүй мэт.
Энэ бол мөрдөгчийн "бусдын үл тоосон жижиг зүйл". “3300 буруу” гэж хараад шууд кодыг ширтэхийн оронд “3300 яг юу вэ” гэж асуусан нь алдааг аль хэдийн хэдэн мөрөнд хүртэл нарийсгалаа.
Алхам 3: Таамаглал
Нотлох баримтаас гурван боломжит сэжигтэн бий. order_total-ийн өгөгдөл гурван алхмаар дамждаг: бараа бүрийн мөрийн дүнг тооцоолох (line_total), тэдгээрийг нэгтгэх (давталт), татвар нэмэх (add_vat). Аль нэг нь буруу.
Таамаглал 1: add_vat буруу. Гэхдээ нотлох баримт үүнийг сулруулж байна: 3300 бол 3000-ийн яг зөв татвартай дүн. Мөн add_vat-д 8.3 дугаар хичээлийн хүснэгт бүхий бүрэн тест бий. Энэ сэжигтнийг хасъя.
Таамаглал 2: line_total талхны мөрийг буруу тооцоолж байна, жишээ нь тэг. Энэ нь 3300-ийг тайлбарлаж чадна.
Таамаглал 3: line_total зөв, харин давталт мөрүүдийг зөв нэгтгэхгүй байна. Энэ ч мөн 3300-ийг тайлбарлаж чадна.
Хоёр сэжигтэн үлдлээ. Нэг шалгалтаар тэдгээрийг ялгах хэрэгтэй.
Алхам 4: print()-ээр шалгах
Хоёр таамаглалыг ялгах ажиглалт юу вэ? Давталтын дотор мөр бүрийн дүн болон subtotal-ийн утгыг харах. Хэрвээ талхны мөрийн дүн тэг бол Таамаглал 2. Хэрвээ мөрийн дүнгүүд зөв боловч subtotal нэмэгдэхгүй бол Таамаглал 3. order.py-ийн давталтад түр мөр нэмнэ үү.
python
for name, price, qty in items:
subtotal = line_total(price, qty)
print(f"DEBUG {name=} {subtotal=}")f-string дотор хувьсагчийн нэрийн ард “=” тэмдэг тавих нь Python-ий тохиромжтой онцлог: {subtotal=} нь зөвхөн утгыг биш, “subtotal=4000” гэж нэрийн хамт хэвлэдэг. Мөрийн эхний “DEBUG” нь энэ бол түр, алдаа хайх зорилготой хэвлэлт гэдгийг тодорхой болгож, дараа нь устгахад хялбар болгоно.
pytest анхдагчаар print-ийг нуудаг тул 9.1 дүгээр хичээлийн “-s” нэмж, зөвхөн унаж буй тестийг ажиллуулна.
Command:
pytest tests\test_order.py -s -k two_itemsГаралт (гол хэсэг):
tests\test_order.py DEBUG name='талх' subtotal=4000
DEBUG name='сүү' subtotal=3000
FНотлох баримт тодорхой. Талхны давталтын дараа subtotal нь 4000: line_total зөв, Таамаглал 2 хасагдлаа. Сүүний давталтын дараа subtotal нь 3000, харин 7000 байх ёстой байсан. Нийлбэр нэмэгдэхгүй, харин солигдож байна. Таамаглал 3 батлагдлаа. Одоо давталтын мөрийг дахин хараарай: subtotal = line_total(price, qty). Тэнцүүгийн тэмдэг утгыг нэмдэггүй, дарж бичдэг. Энэ нь subtotal += line_total(price, qty) байх ёстой байсан.
Бид алдааг кодыг ширтэж биш, нотлох баримтаар олсон. Нэг шалгалт гурван сэжигтнээс нэгийг ялгалаа.
Алхам 5: Засаад батлах
Давталтын мөрийг засаж, DEBUG мөрийг устгана уу.
python
for name, price, qty in items:
subtotal += line_total(price, qty)DEBUG мөрийг устгах нь нэмэлт алхам биш, засварын хэсэг. Түр хэвлэлт кодонд үлдвэл программ хэрэглэгчдэд утгагүй мөрүүд харуулж эхэлнэ.
Command:
pytestГаралт (сүүлийн мөр):
============================= 38 passed in 0.06s ==============================test_order_total_two_items одоо давж байна, бусад бүх тест давсаар байна. Таны нийт тестийн тоо өөр байж болно. Нэгдүгээр алхамд бичсэн тест цаашид энэ алдаа буцаж ирэхээс хамгаална: хэрэглэгчийн мэдээлэл бүтдэг харуул болж хувирлаа.
Яагаад сайн
print() бол debugging-ийн хамгийн түгээмэл хэрэгсэл бөгөөд үүнийг ичих шаардлагагүй. Дэлхийн хамгийн туршлагатай хөгжүүлэгчид ч өдөр бүр ашигладаг. Түүний давуу талууд бодит. Ямар ч тохиргоо шаардахгүй: нэг мөр нэмж, ажиллуулна. Хаана ч ажиллана: таны компьютер, сервер, хэн нэгний terminal. Python-ий эхний хичээлээс эхлэн мэддэг. Дээрх жишээнд нэг print мөр гурван таамаглалаас нэгийг ялгахад хангалттай байлаа.
Хэдэн тустай зөвлөгөө бий. Хэвлэлт бүрт шошго өг, “DEBUG” гэх мэт, эсвэл дээрх {name=} хэлбэрийг ашигла: олон утга хэвлэхэд аль нь аль болохыг мэдэх хэрэгтэй. Утгын төрөл чухал үед {value!r} ашигла: энэ нь утгыг Python-ий код хэлбэрээр хэвлэдэг тул ‘500’ текст ба 500 тоо хоёрыг ялгана, 7.4 дүгээр хичээлийн format_price-ийн асуудлыг санаарай. Хил дээр хэвлэ: функцэд юу орж ирж, юу гарч байгааг хэвлэх нь алдаа функцийн дотор уу, гадна уу гэдгийг тэр дороо хагаслана. Мөн print-ийг шалгалт болгож ашигла, санамсаргүй тараах биш: тодорхой таамаглалыг шалгах тодорхой хэвлэлт.
Хаана хүрэлцэхгүй болдог
Гэхдээ print()-ийн хязгаарыг ч шударгаар нэрлэе. Нэгдүгээрт, шалгалт бүр кодыг өөрчилж, дахин ажиллуулахыг шаарддаг. Өөр утга харах хэрэгтэй болбол дахин print нэмж, дахин ажиллуулна. Хэдэн таамаглалтай нийлмэл алдаанд энэ мөчлөг удаан, ядаргаатай болдог. Хоёрдугаарт, давталт олон удаа явбал хэвлэлт үерлэнэ: мянган мөр бүхий давталтад print мянган мөр гаргаж, хэрэгтэй мөрийг хайх нь шинэ асуудал болно. Гуравдугаарт, зөвхөн хэвлэх гэж бодсон зүйлээ л харна: хэрвээ таамаглал тань буруу бол буруу утгыг хэвлэж, жинхэнэ сэжүүрийг харахгүй өнгөрнө. Дөрөвдүгээрт, түр хэвлэлтийг устгахаа мартах нь элбэг бөгөөд тэдгээр commit-д орж, бусдад харагддаг.
Эдгээр хязгаарын хоёр нь энэ Бүлгийн дараагийн хичээлүүдийн шалтгаан. Дараагийн хичээлийн VS Code debugger программыг аль ч мөрөнд зогсоож, бүх хувьсагчийг кодонд нэг мөр ч нэмэлгүйгээр харах боломж олгодог: "юуг хэвлэх вэ" гэж урьдчилан таах шаардлагагүй болно. 10.4 дүгээр хичээлийн logging модуль түр хэвлэлтийг устгах шаардлагагүй, хүссэн үедээ асааж унтраадаг мэргэжлийн бүртгэл болгоно.
Git-ээр хүрээг нарийсгах
Хагаслах арга зөвхөн кодын мөрүүдэд биш, цаг хугацаанд ч ажилладаг. Хэрвээ нэг функц өнгөрсөн долоо хоногт зөв ажиллаж байсан бол асуудал энэ долоо хоногийн өөрчлөлтүүдийн аль нэгэнд байна. 2.3 дугаар хичээлийн git log болон git diff сэжигтнүүдийн жагсаалтыг гаргадаг: "ажиллаж байсан сүүлийн commit болон одоогийн хооронд юу өөрчлөгдсөн бэ?" Тэр өөрчлөлтүүдийн дунд алдаа бий. Хэрвээ олон commit байвал Git-д git bisect гэдэг command бий бөгөөд тэр түүхийн дундах commit-ыг сонгож, "энэ зөв үү, буруу юу" гэж асууж, яг хагаслах аргаар алдаа орж ирсэн commit-ыг хэдхэн алхамд олдог. Энэ command-ыг энэ сургалтад судлахгүй ч нэрийг нь санаарай: том төсөлд энэ бол маш хүчтэй хэрэгсэл.
Нугасанд тайлбарлах
Нэг хачирхалтай мэт боловч алдартай, үнэхээр ажилладаг арга бий. Таны ширээн дээр тоглоомон нугас, эсвэл ямар ч эд зүйл байгаа гэж бодоорой. Кодоо түүнд мөр мөрөөр нь чанга дуугаар тайлбарла: "энэ мөр subtotal-ийг тэгээр эхлүүлнэ, энэ давталт бараа бүрээр явна, энэ мөр subtotal-д мөрийн дүнг..." Олон тохиолдолд та өгүүлбэрээ дуусгахаасаа өмнө “...дарж бичнэ. Өө.” гэж өөрөө алдаагаа олно. Кодыг толгойдоо уншихад бид түүний юу хийх ёстойг уншдаг, чанга тайлбарлахад жинхэнэ юу хийж байгааг нь уншихаас өөр аргагүй болдог. Хөгжүүлэгчид үүнийг “rubber duck debugging” буюу резинэн нугасны debugging гэж нэрлэдэг.
Алдааг жижигрүүлэх
Хэрвээ алдаа том программын дунд, олон модулийг дамжиж гарч байвал түүнийг давтаж гаргадаг хамгийн жижиг жишээ рүү багасга. Дээрх жишээнд бид бүхэл программ биш, python -c-ийн нэг мөрөөр order_total-ийг хоёрхон бараатай шууд дуудсан. Жишээ бага байх тусам сэжигтэн цөөн. Мөн 9.2 дугаар хичээлийн санаа энд ч тусалдаг: цэвэр функцуудтай кодыг тусад нь дуудаж шалгахад хялбар тул алдааг жижигрүүлэх нь амархан.
Хүсвэл энэ хичээлийн аргачлалыг өөр нэг нуусан алдаан дээр туршаад үзээрэй. order.py-ийн line_total-д “qty >= 10”-ийг “qty > 10” болгож, хэнд ч хэлэлгүй файлаа хадгал. Дараа нь гэр бүлийн гишүүн эсвэл найзаасаа "яг арван өндөг авахад хөнгөлөлт гарахгүй байна" гэсэн мэдээлэл ирсэн гэж төсөөлж, зургаан алхмыг дагаарай: давтаж гарга, тест бич, тоонуудаас таамаглал гарга, шалга, зас, батал. Аль алхам хамгийн их тусалсныг ажиглаарай. Мөн хүсвэл кодоо нугасанд тайлбарлаж үзээрэй. Дууссаны дараа алдааг засаж, бүх тест ногоон болсон эсэхийг шалгаарай.
Санамсаргүй өөрчлөлт хийх. "Энд нэг юм өөрчилж үзье, ажиллах уу" гэсэн арга заримдаа азаар ажилладаг ч ихэнхдээ шинэ алдаа нэмж, анхныг нь нуудаг. Хэрвээ өөрчлөлт ажилласан ч та яагаад ажилласныг мэдэхгүй бөгөөд алдаа өөр хэлбэрээр буцаж ирж магадгүй. Кодыг өөрчлөхөөс өмнө таамаглал, таамаглалаас өмнө нотлох баримт.
Нэг дор олон зүйл өөрчлөх. Гурван өөрчлөлт хийгээд алдаа арилсан бол аль нь засварласан бэ? Мөн хоёр нь шинэ асуудал үүсгээгүй гэдэгт итгэлтэй байна уу? Нэг удаад нэг өөрчлөлт, тус бүрийн дараа тест. Хэрвээ олон өөрчлөлт хийж хутгалдвал 2.5 дугаар хичээлийн git restore таныг сүүлийн commit-ын цэвэр байдалд буцаана: Git debugging-ийн аюулгүйн сүлжээ.
Шинж тэмдгийг засах. 7.4 дүгээр хичээлийн анхааруулга энд хамгийн хүчтэй хамаатай. Хэрвээ та test_order_total_two_items-ийн 7700-ийг 3300 болгосон бол тест ногоон болох байсан, алдаа хэвээрээ. Мөн order_total-д “if len(items) > 1: subtotal = ...” гэх мэт онцгой тохиолдлын нөхөөс нэмэх нь ч шинж тэмдгийг засах. Шалтгааныг ол: энд тэр нь “=” ба “+=” хоёрын ялгаа. Шалтгааныг засвал бүх тохиолдол зөв болно.
Буруу кодыг debug хийх. Заримдаа хэдэн минут хайсны эцэст таны ажиллуулж буй код таны засаж буй код биш болох нь тодорхой болдог: файл хадгалагдаагүй, өөр фолдерт ажиллаж байна, хуучин venv идэвхтэй байна, эсвэл өөр салаан дээр байна. Debugging эхлэхээс өмнө, мөн хачин үр дүн гарах бүрт хамгийн энгийн асуултуудыг асуу: файлаа хадгалсан уу, VS Code-ийн табд цагаан цэг байна уу? Зөв фолдерт байна уу, pwd? Зөв салаан дээр байна уу, VS Code-ийн зүүн доод булан?
Түр хэвлэлтийг commit хийх. DEBUG мөрүүд commit-д орж, GitHub дээр харагдах нь түгээмэл. 2.3 дугаар хичээлийн дадал энд хамгаалдаг: commit хийхээсээ өмнө git diff --staged-ээр юу орох гэж байгааг хар. “DEBUG” шошго тэдгээрийг олоход хялбар болгодог: Select-String -Path *.py -Pattern "DEBUG" нь 3.3 дугаар хичээлийн conflict тэмдэглэгээг хайсантай адил аргаар үлдсэн хэвлэлтүүдийг олно.
Сангийн алдаа гэж таамаглах. Кодоо удаан хайгаад олохгүй бол “Python эсвэл энэ package алдаатай байх” гэж бодох уруу таталт төрдөг. Олон жил, олон сая хүн ашигласан хэрэгслүүдэд алдаа байх нь бий ч маш ховор. Хамгийн магадлалтай сэжигтэн үргэлж таны өнөөдөр бичсэн код. Сангийн алдааг сэжиглэхээсээ өмнө түүнийг давтаж гаргадаг хамгийн жижиг жишээ бичиж үз: ихэнхдээ энэ явцад алдаа тань өөрийн кодонд байсныг олно.
Debugging бол азаар биш, аргачлалаар хийгддэг ур чадвар бөгөөд мөрдөгчийн ажилтай адил: нотлох баримт, таамаглал, шалгалт, сэжигтнүүдийг цөөрүүлэх. Зургаан алхам: алдааг тогтмол давтаж гарга, боломжтой бол унадаг тест болгож бич; алдааны мессеж, traceback, буруу тоог бүрэн унш, ялангуяа тоо өөрөө юу болохыг асуу; тодорхой, шалгагдах таамаглал дэвшүүл; таамаглалыг үнэн, худал хоёрт өөр үр дүн өгөх ажиглалтаар шалга; шалгалт бүрээр хүрээгээ хагасла; шалтгааныг нь засаж, тестээр батал. print() бол хүндтэй, тохиргоогүй, хаана ч ажилладаг анхны хэрэгсэл: шошготой хэвлэ, {x=} болон {x!r} хэлбэрийг ашигла, хил дээр хэвлэ, засварын дараа устга. Түүний хязгаар нь дахин ажиллуулах мөчлөг, үерлэх гаралт, зөвхөн таамагласан зүйлээ харах, устгахаа мартах. Git log, diff ба bisect цаг хугацаанд хүрээг нарийсгадаг, нугасанд тайлбарлах нь кодын жинхэнэ үйлдлийг уншуулдаг, алдааг жижигрүүлэх нь сэжигтнүүдийг цөөрүүлдэг. Санамсаргүй өөрчлөлт, олон өөрчлөлт нэг дор, шинж тэмдгийг засах нь хамгийн түгээмэл буруу алхмууд.
Дараагийн хичээлд print()-ийн хязгааруудын эхнийхийг даван туулах хэрэгслийг сурна: VS Code debugger. Программыг киног удаашруулж үзэх шиг хүссэн мөрөнд зогсоож, алхам алхмаар урагшлуулж, бүх хувьсагчийн утгыг кодонд нэг мөр ч нэмэлгүйгээр харна. Энэ хичээлийн order_total-ийн алдааг тэр хэрэгслээр дахин олж үзнэ.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.