Ачааллж байна...
Түвшин 2 эхэлж байна, бид шууд энэ курсийн хамгийн чухал сэдвүүдийн нэг рүү орно.
Танд шууд хэлье: энэ бүлэг бол FastAPI-д бэлтгэх шууд бэлтгэл юм. Курсийн эхний хичээлд би "орчин үеийн framework-үүд танаас тодорхой зүйлсийг мэднэ гэж таамагладаг" гэж хэлсэн. Type hint бол тэдгээрийн хамгийн эхнийх, хамгийн чухал нь. FastAPI бол зүгээр л type hint-ийг ашигладаг framework биш — тэр бүхэлдээ type hint дээр БАРИГДСАН. Түүний хамгийн гайхалтай чадвар болох автомат баримт бичиг, автомат шалгалт бүгд таны бичсэн type hint-ээс урган гардаг. Type hint мэдэхгүй хүн FastAPI-гийн documentation-ыг уншиж чадахгүй — тэр нь эхний хуудсанаас л таныг мэднэ гэж таамаглана.
Гэхдээ бүү яараарай. Энэ хичээлд бид код бичихээс илүү ОЙЛГОХОД анхаарна. Type hint гэж юу болох, яагаад бий болсон, Python түүнийг ЯАЖ ХАРДАГ вэ — эдгээр асуултад хариулна. Бичлэгийн нарийвчлалыг дараагийн хичээлүүдэд үзнэ.
Дараах функцийг хараарай. Энэ бол Курс 1-ийн хэв маягийн код.
python
def tootsoolokh(a, b):
return a + bОдоо надад хэлээч: a гэж юу вэ?
Та мэдэхгүй. Би ч бас мэдэхгүй. Тэр нь тоо байж болно. String байж болно. Жагсаалт байж болно. Учир нь + тэмдэг нь гурвуулан дээр ажилладаг:
python
print(tootsoolokh(2, 3))
print(tootsoolokh("Сайн ", "байна уу"))
print(tootsoolokh([1, 2], [3, 4]))5
Сайн байна уу
[1, 2, 3, 4]Гурвуулаа ажиллалаа. Python нь a ба b -г юу ч байсан хамаагүй хүлээж авна.
Энэ уян хатан байдал нь эхлэгчид тохиромжтой. Гэвч программ томрох тусам тэр нь ЗОВЛОН болж хувирдаг. Хэдэн шалтгааныг үзье.
Шалтгаан 1: та кодыг уншихдаа мэдэхгүй. Хэдэн сарын дараа энэ функц рүү буцаж ирээд tootsoolokh гэж юу хийдэг байсныг санахыг оролдоно. Тэр нь тоо нэмдэг үү, string холбодог уу? Кодыг бүхэлд нь уншиж, түүнийг хаана дуудсаныг хайж, тэндээс тааж мэдэх хэрэгтэй болно.
Шалтгаан 2: код бичих орчин танд туслаж чадахгүй. VS Code гэх мэт орчинд та a. гэж бичихэд ямар method байгааг санал болгодог. Гэвч a нь юу болохыг мэдэхгүй бол ямар ч санал өгч чадахгүй. Хэрэв Python нь a бол string гэдгийг мэдэж байсан бол .upper(), .split(), .replace() гэж шууд санал болгох байсан.
Шалтгаан 3: алдаа хожуу илэрдэг. Дараах кодыг хараарай:
python
def tootsoolokh(a, b):
return a + b
une = input("Үнэ: ")
too = input("Тоо: ")
print(tootsoolokh(une, too))Хэрэглэгч 15000 ба 3 гэж бичвэл юу гарах вэ? 45000 биш — "150003" гарна. Учир нь input() нь ҮРГЭЛЖ string буцаадаг (Курс 1-ээс санаж байгаа байх), тэгэхээр + нь тоог нэмээгүй, харин хоёр string-ийг холбосон. Алдааны мессеж гарахгүй. Программ ажиллаж байгаа мэт харагдана. Гэхдээ буруу хариулт өгч байна.
Ийм алдаа хамгийн аюултай нь. Хэрэв программ унасан бол та шууд мэдэх байсан. Гэтэл тэр чимээгүй, эелдэг, буруу ажиллаж байна.
Шалтгаан 4 (хамгийн чухал): бусад хүмүүсийн код. Хэрэв та requests сангийн documentation-ыг уншихад def get(url, timeout=None) гэж бичсэн байвал — timeout нь юу вэ? Секунд үү? Миллисекунд үү? Тоо юу, string юу? Documentation унших хэрэгтэй болно. Гэвч хэрэв тэнд def get(url: str, timeout: float | None = None) гэж бичсэн байвал — та шууд мэднэ. Хариулт кодод нь өөрт нь бичигдсэн байна.
Type hint нь нэг л зүйл хийдэг: та кодоо бичихдээ "энэ утга ямар төрөл байх ёстой" гэдгээ ЗАРЛАДАГ.
Дээрх функцийг type hint-тэйгээр бичье:
python
def tootsoolokh(a: int, b: int) -> int:
return a + bОдоо бүх зүйл тодорхой боллоо. a: int гэдэг нь "a нь бүхэл тоо байх ёстой" гэсэн зарлал. b: int — мөн адил. -> int гэдэг нь "энэ функц бүхэл тоо буцаана" гэсэн зарлал.
Кодыг уншиж байгаа хүн (та өөрөө хэдэн сарын дараа, эсвэл өөр хүн) энэ функцийн гэрээг шууд харж байна. Documentation унших хэрэггүй. Функцийн дотор орох хэрэггүй. Гарчиг нь өөрөө хэлж байна.
Ялгааг тод харъя:
python
# Type hint-гүй — юу ч мэдэгдэхгүй
def hun_burtgekh(ner, nas, idevkhtei):
...
# Type hint-тэй — бүх зүйл тодорхой
def hun_burtgekh(ner: str, nas: int, idevkhtei: bool) -> None:
...Хоёр дахь хувилбарыг харах бүрдээ та ner нь string, nas нь бүхэл тоо, idevkhtei нь True/False гэдгийг шууд мэдэж байна. Мөн -> None нь "энэ функц юу ч буцаадаггүй, зөвхөн үйлдэл хийдэг" гэсэн үг.
Курс 1-д бид хувьсагчийг шошготой хайрцаг гэж зүйрлэсэн. Хайрцаг дотор утга байна, гадуур нь НЭР бичсэн шошго байна.
Type hint нь тэр шошгонд ХОЁР ДАХЬ МӨР нэмж байна: агуулгын төрөл.
Өмнө нь шошго ингэж харагдаж байсан:
┌─────────────┐
│ nas │
│ 25 │
└─────────────┘Одоо ингэж:
┌─────────────┐
│ nas │
│ int │
│ 25 │
└─────────────┘Агуулах доторх хайрцгуудыг харж байгаа хүн одоо тус бүрд нь юу байхыг мэдэж байна. "Энэ хайрцагт тоо, тэр хайрцагт текст, нөгөө хайрцагт нэрсийн жагсаалт."
Гэхдээ энэ зүйрлэлд ЧУХАЛ нарийвчлал байна, түүнийг одоо хэлэх ёстой.
Одоо би танд гэнэтийн зүйл хэлье, энэ бол энэ хичээлийн хамгийн чухал өгүүлбэр:
Python нь type hint-ийг шалгадаггүй. Тэр тэднийг бүрэн үл тоомсорлодог.
Итгэхгүй байна уу? Өөрсдийн нүдээр харъя.
python
def tootsoolokh(a: int, b: int) -> int:
return a + b
print(tootsoolokh("Сайн ", "байна уу"))Сайн байна ууЯмар ч алдаа гарсангүй. Ямар ч анхааруулга байхгүй. Бид int гэж зарласан газарт string дамжуулсан ч Python нь мөрөө ч хөдөлгөсөнгүй.
Энэ нь эхэндээ ойлгомжгүй санагдана. Хэрэв Python нь тэднийг үл тоомсорлодог бол ЮУНЫ ТӨЛӨӨ бичдэг юм бэ?
Хариулт нь: type hint нь Python-д зориулагдаагүй. Тэдгээр нь ХҮМҮҮС ба ХЭРЭГСЛҮҮДЭД зориулагдсан.
Гурван хүлээн авагч байна.
1. Кодыг уншиж байгаа хүн. Та өөрөө. Таны хамтрагч. Таны сангийн хэрэглэгч. Type hint нь documentation-ы хамгийн шууд, хамгийн үнэн хэлбэр юм — учир нь тэр нь кодтой ХАМТ амьдардаг тул хоцрох боломжгүй.
2. Код бичих орчин (VS Code гэх мэт). Type hint байвал editor нь танд илүү сайн туслана. ner: str гэж бичсэн бол ner. гэж бичихэд editor нь бүх string method-ыг санал болгоно. Мөн та ner.appendx() гэж байхгүй method бичвэл editor нь улаанаар зурж, ажиллуулахаас өмнө анхааруулна.
3. Type checker хэмээх тусгай хэрэгслүүд. mypy, pyright гэх мэт программууд байдаг. Тэдгээр нь таны кодыг АЖИЛЛУУЛАХГҮЙГЭЭР уншиж, type hint-ийн зөрчил байгаа эсэхийг шалгадаг. Тэдгээрийг та энэ курсэд заавал хэрэглэх шаардлагагүй, гэхдээ мэргэжлийн төслүүдэд өргөн ашиглагддаг гэдгийг мэдэж байгаарай.
4. Framework-үүд (энэ бол хамгийн гайхалтай нь). Зарим framework нь type hint-ийг УНШИЖ, тэдгээрийг үндэслэн ажилладаг. FastAPI бол яг тийм. Тэр таны type hint-ийг уншиж, түүнээс автоматаар баримт бичиг үүсгэж, ирж байгаа өгөгдлийг автоматаар шалгаж, буруу төрөлтэй бол алдаа буцаадаг. Өөрөөр хэлбэл FastAPI нь Python-ы үл тоомсорлодог зүйлийг АВЧ, түүнийг ажиллуулж байна.
Энэ сүүлчийн зүйлийг сайн ойлгоорой, учир нь энэ бол таны курсийн төгсгөлд харах гайхамшгийн шалтгаан юм. Бүлэг 15-д та FastAPI программ бичээд /docs хуудсыг нээхэд бүрэн ажиллагаатай, интерактив баримт бичиг үзэх болно. Тэр баримт бичиг хаанаас гарч ирсэн бэ? Таны бичсэн type hint-үүдээс. Өөр юунаас ч биш.
Тэгэхээр өмнөх зүйрлэлийг засах хэрэгтэй байна. Type hint бол хайрцгийг ХААЖ БАЙГАА түгжээ БИШ. Тэр бол зөвхөн ШОШГО.
Агуулахын хайрцган дээр "ЭМЗЭГ — ШИЛ" гэж бичсэн байна гэж төсөөлье. Тэр шошго нь хайрцгийг эвдрэхээс ХАМГААЛАХГҮЙ. Хэрэв та түүнийг доош шидвэл шил хагарна, шошго тусалж чадахгүй.
Тэгвэл шошго юуны төлөө вэ? Учир нь тэр нь ХҮМҮҮСТ хэлж байна: "энэ хайрцагт болгоомжтой хандаарай." Ажилчид түүнийг харж, болгоомжтой зөөнө. Ачааны машины жолооч түүнийг доод давхарт тавихгүй. Шошго нь ажилладаг — гэхдээ хүмүүсээр дамжин, албадлагаар биш.
Python-ы type hint яг ийм. Тэдгээр нь албадлагагүй, гэхдээ хэрэгтэй. Тэднийг үл тоомсорлож болно, гэхдээ хэн ч тэгдэггүй — учир нь тэднийг бичсэн хүн шалтгаантай бичсэн байдаг.
Дараах кодыг хараарай. Энэ бол ЗОРИУДААР ХУДАЛ hint.
python
def ner_avakh() -> str:
return 12345
ner = ner_avakh()
print(ner)
print(type(ner))12345
<class 'int'>Функц нь -> str гэж зарласан боловч int буцааж байна. Python нь юу ч гэсэнгүй.
Энэ бол чухал сургамж: type hint нь баталгаа биш, амлалт юм. Та амлалтаа зөрчиж чадна. Python таныг зогсоохгүй. Гэвч амлалтаа зөрчих нь буруу — учир нь таны кодыг ашиглаж байгаа хүн танд ИТГЭСЭН байна.
VS Code гэх мэт editor нь дээрх кодыг харвал улаанаар зурж анхааруулна. Хэрэв та mypy ажиллуулбал:
main.py:2: error: Incompatible return value type (got "int", expected "str")Incompatible return value type (got "int", expected "str") гэдэг нь "буцаах утгын төрөл нийцэхгүй байна: int ирлээ, str хүлээж байсан" гэсэн үг. Хэрэгслүүд таны алдааг барьж байна — Python барихгүй ч гэсэн.
Тиймээс дүрэм нь: hint бичвэл ҮНЭН бич. Худал hint нь hint огт байхгүйгээс ДОР — учир нь тэр нь уншигчийг идэвхтэй төөрөгдүүлж байна.
Одоо type hint-ийн жинхэнэ ашиг тусыг харуулъя. Дээрх input() -ийн асуудал руу буцъя.
python
def niit_tootsoolokh(une: int, too: int) -> int:
return une * too
une = input("Үнэ: ")
too = input("Тоо: ")
print(niit_tootsoolokh(une, too))Хэрэглэгч 15000 ба 3 гэж бичвэл:
Traceback (most recent call last):
File "main.py", line 8, in <module>
print(niit_tootsoolokh(une, too))
File "main.py", line 2, in niit_tootsoolokh
return une * too
TypeError: can't multiply sequence by non-int of type 'str'Энэ жишээнд * нь хоёр string дээр ажиллахгүй тул Python өөрөө алдаа гаргалаа (нэмэхээс ялгаатай). Гэхдээ гол нь: VS Code энэ алдааг АЖИЛЛУУЛАХААС ӨМНӨ илрүүлнэ. une нь input()-аас ирсэн тул str гэдгийг editor мэднэ. Функц нь int шаардаж байна. Editor нь une дор улаан зураас татаж, "Argument of type 'str' cannot be assigned to parameter of type 'int'" гэж анхааруулна.
Тэгэхээр та программаа ажиллуулахаас өмнө, кодоо бичиж байхдаа алдаагаа хараад засна:
python
def niit_tootsoolokh(une: int, too: int) -> int:
return une * too
une = int(input("Үнэ: "))
too = int(input("Тоо: "))
print(niit_tootsoolokh(une, too))Үнэ: 15000
Тоо: 3
45000Одоо зөв. int() -ээр хөрвүүлснээр type hint-ийн амлалт биелэгдлээ.
Энэ бол type hint-ийн жинхэнэ өгөөж: алдааг ажиллуулахаас өмнө барих. Тэр нь программ унасны дараа алдаа хайхаас хамаагүй хямд.
Түүхийг товч хэлье, учир нь тэр нь бүх зүйлийг тайлбарладаг.
Python нь 1991 онд бүтээгдсэн бөгөөд түүний нэг гол зарчим нь энгийн, хурдан, уян хатан байх байсан. Төрөл зарлах шаардлагагүй байх нь давуу тал гэж үзэгдсэн — та зүгээр л x = 5 гэж бичээд ажиллуулна, int x = 5 гэж бичих шаардлагагүй. Энэ нь Python-ыг сурахад хялбар, бичихэд хурдан болгосон.
Гэвч 2000-аад оны сүүлээр Python нь жижиг script бичих хэлээс ГАРЧ, том системүүд, компаниудын гол хэл болж эхэлсэн. Google, Instagram, Dropbox зэрэг компаниуд сая сая мөр Python код бичиж эхэлсэн. Тэр хэмжээнд төрөл мэдэхгүй байх нь давуу тал биш, харин ЗОВЛОН болсон.
Тиймээс 2014 онд Python-д type hint нэмэгдсэн (PEP 484). Гэхдээ маш чухал шийдвэр гаргасан: тэдгээрийг ЗААВАЛ БИШ, мөн АЛБАДЛАГАГҮЙ болгосон. Хуучин код бүгд хэвээр ажиллана. Шинэ код нь хүсвэл hint бичнэ, хүсэхгүй бол үгүй. Python нь тэднийг шалгахгүй.
Энэ шийдвэр эхэндээ хачирхалтай санагдсан. Гэвч тэр нь гайхалтай үр дүнд хүрсэн: Python нь эхлэгчид зориулсан энгийн хэл хэвээр үлдэж, ЗЭРЭГ мэргэжлийн том системд тохиромжтой болсон. Та зөвхөн хэрэгтэй газраа hint бичнэ.
Одоо, арав гаруй жилийн дараа, type hint нь мэргэжлийн Python-ы СТАНДАРТ болсон. Орчин үеийн сан бүхэн тэднийг ашигладаг. FastAPI, Pydantic зэрэг framework нь тэднийг зөвхөн ашигладаггүй — тэдгээр дээр БАРИГДСАН.
Тодорхой хэлье:
Бүлэг 4-ийн туршид бид type hint-ийг сурч, дасгал хийнэ.
Хичээл 4.4-өөс эхлэн энэ курсийн БҮХ код бүрэн hint-тэй байх болно. Тэр бол мэргэжлийн зуршил бөгөөд бид түүнийг эндээс эхлүүлнэ.
Бүлэг 6-ын guided build (зарлагын бүртгэл), Бүлэг 9-ийн номын сан, Бүлэг 12-ын цаг агаарын программ — бүгд бүрэн hint-тэй.
Бүлэг 15-ын FastAPI capstone дээр таны бичсэн hint-үүд нь ЖИНХЭНЭ АЖИЛ хийж эхэлнэ.
Хэрэв та эхэндээ hint бичих нь удаан, ядаргаатай санагдвал — тэр нь хэвийн. Хоёр гурван хичээлийн дараа автоматаар бичдэг болно. Мөн editor тань таныг урамшуулж эхлэх болно: hint байгаа кодод editor нь хамаагүй ухаалаг туслах болно.
Хэрэв сонирхвол: VS Code нээгээд дараах кодыг бичээрэй.
python
def mendchilekh(ner: str) -> str:
return f"Сайн байна уу, {ner}!"
ner = "Болд"Дараа нь шинэ мөрөнд ner. гэж бичээд юу санал болгож байгааг хараарай — string-ийн бүх method гарч ирнэ. Одоо ner: int = 5 гэж өөрчлөөд дахин ner. гэж бичээрэй — санал огт өөр болно. Editor нь таны hint-ийг уншиж байгаагийн шууд нотолгоо.
Мөн хүсвэл: def f() -> str: return 123 гэж зориудаар худал hint бичээд, VS Code нь улаанаар зурж байгаа эсэхийг хараарай. Дараа нь ажиллуулаад — Python нь юу ч гэхгүй ажиллуулна. Хоёр ертөнцийн ялгааг өөрийн нүдээр харах болно.
1. Type hint нь шалгалт хийдэг гэж бодох
Хамгийн түгээмэл эндүүрэл. Python нь hint-ийг үл тоомсорлодог. Хэрэв танд бодит шалгалт хэрэгтэй бол өөрөө бич:
python
def tootsoolokh(a: int, b: int) -> int:
if not isinstance(a, int) or not isinstance(b, int):
raise TypeError("a ба b нь бүхэл тоо байх ёстой")
return a + b(raise -ийг Бүлэг 13-т бүрэн үзнэ. Одоохондоо "алдаа зориудаар үүсгэх" гэж ойлгоод өнгөрөөрэй.)
2. Цэгтэй таслалын оронд тэнцүү тэмдэг бичих
python
def mendchilekh(ner = str) -> str:
return f"Сайн байна уу, {ner}!"Алдаа ГАРАХГҮЙ, гэхдээ энэ нь огт өөр зүйл. ner = str гэдэг нь "ner -ийн DEFAULT утга нь str гэсэн ТӨРӨЛ ӨӨРӨӨ" гэсэн үг — hint биш, харин хачирхалтай default утга. Дуудахад mendchilekh() нь "Сайн байна уу, <class 'str'>!" гэж хэвлэнэ.
Зөв бичлэг: ner: str — цэгтэй таслал, тэнцүү тэмдэг биш.
3. Сум мартах
python
def tootsoolokh(a: int, b: int) int:
return a + b File "main.py", line 1
def tootsoolokh(a: int, b: int) int:
^^^
SyntaxError: invalid syntaxБуцаах төрлийн өмнө сум (->) заавал байна: def tootsoolokh(a: int, b: int) -> int:.
4. Худал hint бичих
Алдаа гарахгүй, гэхдээ уншигчийг төөрөгдүүлнэ. Hint бичвэл ҮНЭН бич. Хэрэв та төрлөө мэдэхгүй байвал hint огт бичихгүй байх нь худал бичихээс дээр.
Type hint нь "энэ утга ямар төрөл байх ёстой" гэдгийг зарладаг: def f(a: int, b: str) -> bool:.
Параметрт цэгтэй таслал (ner: str), буцаах утганд сум (-> str).
Python тэднийг ШАЛГАДАГГҮЙ. Худал төрөл дамжуулсан ч ажиллана. Hint бол түгжээ биш, ШОШГО.
Тэдгээр нь ГУРВАН хүлээн авагчид зориулагдсан: кодыг уншиж байгаа ХҮН, код бичих ОРЧИН (VS Code), болон тусгай ХЭРЭГСЛҮҮД (mypy).
Мөн дөрөв дэх нь: зарим framework нь hint-ийг УНШИЖ, ажиллуулдаг. FastAPI бол яг тийм — түүний автомат баримт бичиг, автомат шалгалт бүгд таны hint-ээс урган гардаг.
Hint бол баталгаа биш, амлалт. Худал hint нь hint байхгүйгээс дор.
Editor нь hint-ийн ачаар алдааг ажиллуулахаас өмнө барьж чадна — энэ бол хамгийн шууд ашиг тус.
Python 2014 онд hint нэмсэн бөгөөд тэднийг ЗААВАЛ БИШ байлгах шийдвэр гаргасан. Одоо тэдгээр нь мэргэжлийн стандарт болсон.
Дараагийн хичээлд бид бодит бичлэг рүү орно: int, str, float, bool гэсэн үндсэн hint-үүд, мөн list[int], dict[str, int] гэх мэт цуглуулгын hint-үүд. Тэнд олон жишээ, олон дасгал байх болно. Мөн editor тань таныг хэрхэн урамшуулж эхлэхийг харах болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.