Ачааллж байна...
Хэрэв та Python-ы код интернэтээс харж байсан бол — та энэ мөрийг заавал харсан:
python
if __name__ == "__main__":
main()Тэр нь бараг БҮХ мэргэжлийн Python файлын төгсгөлд байдаг. Тэр нь ямар нэг илбэ, ямар нэг нууц ёслол мэт харагддаг.
Олон хүн түүнийг ойлголгүйгээр хуулдаг. "Бүгд ингэж бичдэг тул би ч бас бичнэ."
Энэ хичээлд бид түүнийг эцэст нь тайлна.
Мөн тэр нь илбэ БИШ гэдгийг та харах болно. Тэр нь зөвхөн if шалгалт — Курс 1-ээс танил, энгийн if. Ганц зүйл нь: тэр нь __name__ гэсэн тусгай хувьсагчийг шалгаж байна.
Бүлэг 12.1-т бид асуудлыг харсан бөгөөд түүнийг "Хичээл 12.3-т шийднэ" гэж хойшлуулсан. Одоо тэр цаг ирлээ.
Бүлэг 12.1-ээс:
tsag_agaar.py:
python
from api import khot_khaikh
def kheveleкh(khot: dict) -> None:
print(f"Хот: {khot['name']}")
ner = input("Хотын нэр: ") # ЧӨЛӨӨТ КОД
khot = khot_khaikh(ner)
if khot:
kheveleкh(khot)Одоо ӨӨР файлаас зөвхөн kheveleкh функцийг ашиглахыг хүсэв:
tailan.py:
python
from tsag_agaar import kheveleкh # зөвхөн НЭГ функц хэрэгтэй
print("Тайлан эхлэв")Ажиллуулбал:
powershell
python tailan.pyХотын нэр:Программ хот асууж байна!
Учир нь: import нь файлыг БҮХЭЛД НЬ ажиллуулдаг (Бүлэг 12.1). Тэр файл дотор input() байсан тул — тэр ажилласан.
Бид зөвхөн ФУНКЦ хүссэн, гэвч БҮХ ПРОГРАММ ажиллав.
Асуудлыг ойлгохын тулд нэг чухал зүйлийг мэдэх ёстой.
Python файл нь ХОЁР өөр аргаар ажиллаж болно:
1. ШУУД ажиллуулах:
powershell
python tsag_agaar.py"Энэ файлыг программ болгож ажиллуул."
2. IMPORT хийх:
python
import tsag_agaar"Энэ файлыг ачаалж, түүний агуулгыг надад өг."
Хоёр тохиолдолд Python нь файлын БҮХ мөрийг ажиллуулна. Ялгаа байхгүй.
Гэвч бидний ХҮСЭЛТ нь ӨӨР:
Шууд ажиллуулахад → программ ажиллах ЁСТОЙ (input(), print(), бүх зүйл)
Import хийхэд → зөвхөн функцууд тодорхойлогдох ёстой, программ ажиллах ЁСГҮЙ
Тэгэхээр асуулт: файл нь ӨӨРӨӨ ЯАЖ мэдэх вэ, түүнийг ЯАЖ ажиллуулж байгааг?
Хариулт: __name__ гэсэн тусгай хувьсагч.
__name__ гэж юу вэPython нь файл ажиллуулах бүрдээ __name__ гэсэн тусгай хувьсагчийг АВТОМАТААР үүсгэдэг.
Тэр хувьсагчийн утга нь ХОЁР зүйлийн НЭГ байна:
1. Хэрэв файлыг ШУУД ажиллуулж байвал:
python
__name__ = "__main__"2. Хэрэв файлыг IMPORT хийж байвал:
python
__name__ = "модулийн_нэр" # жишээ нь "tsag_agaar"Тэр л болоо. Бүх нууц энд байна.
Хоёр файл үүсгэе.
khereгsel.py:
python
# khereгsel.py
print(f"khereгsel.py доторх __name__ = {__name__!r}")
def mendchilekh(ner: str) -> str:
return f"Сайн байна уу, {ner}!"main.py:
python
# main.py
print(f"main.py доторх __name__ = {__name__!r}")
import khereгsel
print(khereгsel.mendchilekh("Болд"))Туршилт 1: main.py -г ажиллуул.
powershell
python main.pymain.py доторх __name__ = '__main__'
khereгsel.py доторх __name__ = 'khereгsel'
Сайн байна уу, Болд!ЯГ ТА ХҮЛЭЭЖ БАЙСАН ЗҮЙЛ:
main.py -г ШУУД ажиллуулсан → __name__ нь "__main__"
khereгsel.py -г IMPORT хийсэн → __name__ нь "khereгsel" (модулийн нэр)
Туршилт 2: khereгsel.py -г ШУУД ажиллуул.
powershell
python khereгsel.pykhereгsel.py доторх __name__ = '__main__'Одоо khereгsel.py -гийн __name__ нь "__main__" болов!
Учир нь тэр нь ОДОО ШУУД ажиллаж байна.
Гол дүрэм:
__name__нь"__main__"бол — энэ файл ШУУД ажиллаж байна.__name__нь өөр юм бол — энэ файл IMPORT хийгдэж байна.
Файл нь өөрөө мэдэж чадна. Тэгэхээр:
python
if __name__ == "__main__":
# ЗӨВХӨН шууд ажиллуулахад энэ код ажиллана
...Тэр л болоо. Энгийн if шалгалт.
Одоо асуудлыг засъя.
tsag_agaar.py (засварласан):
python
# tsag_agaar.py
from api import khot_khaikh
def kheveleкh(khot: dict) -> None:
print(f"Хот: {khot['name']}")
def gol() -> None:
ner = input("Хотын нэр: ")
khot = khot_khaikh(ner)
if khot:
kheveleкh(khot)
if __name__ == "__main__": # ЭНЭ МӨР БҮХ ЗҮЙЛИЙГ ШИЙДНЭ
gol()tailan.py:
python
# tailan.py
from tsag_agaar import kheveleкh
print("Тайлан эхлэв")Ажиллуулна уу:
powershell
python tailan.pyТайлан эхлэвАСУУДАЛ ШИЙДЭГДЛЭЭ.
Программ хот асуухаа больсон. kheveleкh функц нь бэлэн, гэхдээ gol() нь дуудагдаагүй.
Яагаад?
tailan.py нь tsag_agaar -ыг IMPORT хийсэн. Тиймээс tsag_agaar.py доторх __name__ нь "tsag_agaar" болсон, "__main__" БИШ.
Тэгэхээр if __name__ == "__main__": шалгалт нь ХУДАЛ болж, gol() нь АЖИЛЛААГҮЙ.
Одоо tsag_agaar.py -г ШУУД ажиллуулъя:
powershell
python tsag_agaar.pyХотын нэр: Ulaanbaatar
Хот: UlaanbaatarПрограмм ажиллаж байна.
Учир нь одоо __name__ нь "__main__" болсон.
НЭГ ФАЙЛ, ХОЁР ЗАН ТӨЛӨВ. Тэр нь ЯАЖ дуудагдаж байгаагаас хамаарна.
Ойлголтыг бататгах зүйрлэл.
Та байшинтай. Тэр байшинд та ХОЁР үүрэгтэй байж болно:
1. ГЭРИЙН ЭЗЭН. Та өөрийн байшинд байна. Та бүх зүйлийг хийж чадна: хоол хийх, дуу тавих, зочин урих.
2. ЗОЧИН. Та ӨӨР хүний байшинд байна. Та зөвхөн ХЭРЭГТЭЙ зүйлээ хийнэ. Та тэдний дуу тавихгүй, тэдний хоолыг идэхгүй.
__name__ == "__main__" нь "би энд ГЭРИЙН ЭЗЭН мөн үү?" гэсэн асуулт юм.
Тийм (шууд ажиллаж байна) → бүх зүйлээ хий, программаа ажиллуул
Үгүй (import хийгдсэн) → зөвхөн хэрэгтэй зүйлээ өг (функцууд), өөрөө юу ч бүү хий
Мэргэжлийн Python файл нь ЯГ ийм бүтэцтэй байдаг:
python
# main.py
# 1. Import-ууд
import requests
from tsag_agaar.api import khot_khaikh
# 2. Тогтмолууд
TIMEOUT = 10
# 3. Функц ба class-ууд
def khereгsel(x: int) -> int:
return x * 2
def main() -> None:
"""Программын үндсэн логик."""
ner = input("Хотын нэр: ")
khot = khot_khaikh(ner)
...
# 4. Эхлэх цэг — ХАМГИЙН СҮҮЛД
if __name__ == "__main__":
main()Дөрвөн хэсэг, ЯГ энэ дарааллаар.
Функцийн нэр нь main байдаг — тэр нь дэлхийн заншил. gol, run, start гэж нэрлэж болно, гэхдээ main нь хамгийн танигдсан.
if __name__ == "__main__": нь ХАМГИЙН СҮҮЛД байна. Түүний ард юу ч байхгүй.
Яагаад чухал вэ? Учир нь тэр мөр ажиллах үед — түүнээс ДЭЭР байгаа БҮХ функц аль хэдийн тодорхойлогдсон байх ЁСТОЙ.
Хэрэв дээр тавьвал:
python
if __name__ == "__main__":
main() # main хараахан тодорхойлогдоогүй!
def main() -> None:
...NameError: name 'main' is not definedБүлэг 3.4-ийн scope дүрэм: Python нь кодыг ДЭЭРЭЭС ДООШ уншдаг. main нь хараахан оршин байхгүй.
Одоо if __name__ == "__main__": -ийн ХОЁР ДАХЬ, бараг адил чухал ашиг тусыг харъя.
Файл бүрд өөрийн ЖИЖИГ туршилтыг оруулж болно.
python
# tsag_agaar/api.py
import requests
from tsag_agaar.config import FORECAST_URL, GEOCODE_URL, TIMEOUT
def khot_khaikh(ner: str) -> dict | None:
...
def tsag_agaar_avakh(lat: float, lon: float) -> dict | None:
...
# ─── ТУРШИЛТ ───────────────────────────────────────────────
if __name__ == "__main__":
print("api.py -ийг турших...")
print()
khot = khot_khaikh("Ulaanbaatar")
print(f"Хот олдов: {khot['name'] if khot else 'ОЛДСОНГҮЙ'}")
if khot:
tsag_agaar = tsag_agaar_avakh(khot["latitude"], khot["longitude"])
if tsag_agaar:
print(f"Температур: {tsag_agaar['current']['temperature_2m']}°C")
else:
print("Цаг агаар авч чадсангүй")Одоо:
powershell
python -m tsag_agaar.apiapi.py -ийг турших...
Хот олдов: Ulaanbaatar
Температур: 18.7°Capi.py -г ТУСАД НЬ туршлаа!
main.py -г ажиллуулах шаардлагагүй. Хэрэглэгчийн интерфейс шаардлагагүй. Зөвхөн энэ ФАЙЛ л ажиллаж байна.
Гэвч main.py -г ажиллуулахад — тэр туршилтын код НЭГ Ч удаа ажиллахгүй. Учир нь api.py нь import хийгдэж байгаа тул __name__ нь "tsag_agaar.api" болно.
Энэ бол маш хүчирхэг зуршил.
Файл бичээд, тэр дор нь турших. Дараа нь бусад файлаас ашиглах. Туршилтын код нь замд саад болохгүй.
Практик зөвлөгөө: шинэ модуль бичих бүрдээ if __name__ == "__main__": блокт жижиг туршилт нэм. Тэр нь дебаг хийхэд маш их цаг хэмнэнэ.
(Мэргэжлийн төсөлд тэрхүү туршилтууд нь tests/ хавтаст, pytest гэх мэт framework -тэй бичигддэг. Гэхдээ тэр нь өөр бүтэн сэдэв. Энэ энгийн арга нь эхлэгчид бүрэн хангалттай.)
__name__ -ийн жинхэнэ утга — package доторНэг нарийвчлал. Package доторх модулийн __name__ нь ЯМАР байх вэ?
python
# tsag_agaar/api.py
print(f"__name__ = {__name__!r}")powershell
python main.py # main.py нь tsag_agaar.api -г import хийдэг__name__ = 'tsag_agaar.api'БҮТЭН зам — package.module.
Тэгэхээр if __name__ == "__main__": нь ҮРГЭЛЖ зөв ажиллана — учир нь "tsag_agaar.api" нь "__main__" -тэй хэзээ ч тэнцэхгүй.
__ хувьсагчид__name__ бол цорын ганц биш. Python нь хэдэн тусгай хувьсагч үүсгэдэг:
python
# khereгsel.py
"""Энэ бол khereгsel модулийн тайлбар."""
print(f"__name__ = {__name__!r}")
print(f"__file__ = {__file__!r}")
print(f"__doc__ = {__doc__!r}")__name__ = '__main__'
__file__ = 'C:\\Users\\Dulguun\\project\\khereгsel.py'
__doc__ = 'Энэ бол khereгsel модулийн тайлбар.'__file__ — файлын бүтэн зам. Заримдаа хэрэгтэй.
__doc__ — файлын эхэнд байгаа docstring (гурван хашилтанд байгаа тайлбар).
Эдгээрийг цээжлэх шаардлагагүй. Гэхдээ __ -ээр эхэлж, төгсдөг нэрс нь Python-ы дотоод зүйлс гэдгийг мэдэж байгаарай.
Бүлэг 8-ын dunder method-ууд (__init__, __str__) — ижил заншил. Давхар доогуур зураас нь "энэ бол Python-ы тусгай зүйл" гэсэн дохио.
if __name__ == "__main__": бичих вэЗААВАЛ бич:
main.py — программын эхлэх цэг. ҮРГЭЛЖ.
Import хийгдэж болзошгүй ЯМАР Ч файл — өөрөөр хэлбэл БАРАГ бүх файл.
Бичихгүй ч болно:
Нэг удаагийн script, хэзээ ч import хийгдэхгүй. Гэхдээ зуршил болгож бичих нь дээр.
Практик дүрэм: ҮРГЭЛЖ бич. Тэр нь хоёр мөр, гэхдээ:
Гэнэтийн зан төлвөөс хамгаална
Файлыг тусад нь туршиж болно
Уншигчид "энэ бол эхлэх цэг" гэж хэлнэ
Хэрэв та эргэлзэж байвал — бич. Хэзээ ч хор хөнөөл учруулахгүй.
Хэрэв сонирхвол: хоёр файл үүсгээд, тус бүрд print(f"__name__ = {__name__}") гэсэн мөр нэмээрэй. Дараа нь тус бүрийг ШУУД ажиллуулж, дараа нь import хийж, __name__ хэрхэн өөрчлөгдөж байгааг өөрийн нүдээр хараарай.
Тэр туршилт нь энэ хичээлийн БҮХ агуулгыг бүрэн ойлгуулна. Тэр нь илбэ биш — зөвхөн хувьсагчийн утга өөрчлөгдөж байна.
Мөн хүсвэл: Бүлэг 12.2-ын api.py -д туршилтын блок нэмээд, python -m tsag_agaar.api гэж ажиллуулж үзээрэй. Дараа нь python main.py ажиллуулж, туршилтын код НЭГ Ч удаа ажиллаагүйг батлаарай.
1. Тэнцүү тэмдгийг нэг бичих
python
if __name__ = "__main__":SyntaxError: invalid syntaxХарьцуулалт нь ХОЁР тэнцүү тэмдэг: ==. Нэг нь утга ОЛГОНО.
2. Доогуур зураасны тоог андуурах
python
if __name__ == "__main__": # ЗӨВ — ХОЁР доогуур зураас ХОЁР талд
if _name_ == "_main_": # БУРУУ — нэг зураас
if __name__ == "__MAIN__": # БУРУУ — том үсэгЯГ ингэж бич: давхар доогуур зураас, жижиг үсэг.
Хэрэв буруу бичвэл — алдаа гарахгүй, гэхдээ блок НЭГ Ч удаа ажиллахгүй. Тэр нь маш төөрөгдүүлдэг.
3. Файлын ЭХЭНД тавих
python
if __name__ == "__main__":
main()
def main() -> None:
...NameError: name 'main' is not definedХАМГИЙН СҮҮЛД тавь.
4. main() -ийг ХААЛТГҮЙ бичих
python
if __name__ == "__main__":
main # ХААЛТГҮЙ!Алдаа гарахгүй, гэхдээ функц ДУУДАГДАХГҮЙ. Программ юу ч хийхгүй.
Бүлэг 3.5-ын сургамж: main нь функц ӨӨРӨӨ, main() нь ДУУДАЛТ. Хаалт бүх ялгааг үүсгэдэг.
5. Блокт хэт олон код бичих
python
if __name__ == "__main__":
ner = input("Нэр: ")
khot = khot_khaikh(ner)
if khot is None:
print("Олдсонгүй")
else:
tsag_agaar = tsag_agaar_avakh(...)
...
# 50 мөр...Ажиллана, гэхдээ муу. Блок нь БОГИНО байх ёстой — ихэвчлэн ганц мөр:
python
if __name__ == "__main__":
main()Бүх логик нь main() функц дотор. Тэгвэл тэр функцийг бусад газраас ч дуудаж болно.
6. Блокгүйгээр модульд чөлөөт код байлгах
python
# api.py
uguudul = tsag_agaar_avakh(47.92, 106.92) # import хийхэд АЖИЛЛАНА!Import хийх бүрд API дуудагдана. Аймшигтай. Блокт ор.
Python файл нь ХОЁР замаар ажиллаж болно: ШУУД (python file.py) эсвэл IMPORT (import file).
Хоёр тохиолдолд Python нь файлын БҮХ мөрийг ажиллуулна. Гэвч бидний ХҮСЭЛТ өөр.
__name__ нь Python-ы АВТОМАТ хувьсагч:
ШУУД ажиллуулахад → "__main__"
IMPORT хийхэд → модулийн нэр ("tsag_agaar.api")
if __name__ == "__main__": нь зөвхөн ЭНГИЙН if шалгалт. Илбэ БАЙХГҮЙ.
Уншихдаа: "би энд ГЭРИЙН ЭЗЭН мөн үү?"
Стандарт хэв маяг:
python
import ... # 1. Import-ууд
TIMEOUT = 10 # 2. Тогтмолууд
def main() -> None: # 3. Функц, class-ууд
...
if __name__ == "__main__": # 4. Эхлэх цэг — ХАМГИЙН СҮҮЛД
main()Блок нь ХАМГИЙН СҮҮЛД байх ёстой — эс тэгвээс NameError.
Блок нь БОГИНО байх ёстой — ихэвчлэн ганц мөр (main()). Бүх логик нь функц дотор.
ХОЁР ДАХЬ АШИГ ТУС: файл бүрийг ТУСАД НЬ турших.
python
if __name__ == "__main__":
# энэ модулийн жижиг туршилтpython -m package.module — тусад нь ажиллуулна. Import хийхэд ажиллахгүй.
__ -ээр эхэлж төгсдөг нэрс нь Python-ы тусгай зүйлс (__name__, __file__, __doc__, __init__, __str__) — Бүлэг 8-ын dunder-тэй ижил заншил.
ҮРГЭЛЖ бич. Хоёр мөр, гэхдээ гэнэтийн зан төлвөөс хамгаална.
Дараагийн хичээлээр Түвшин 4 дуусна.
Бид цаг агаарын программ бичнэ — жинхэнэ API-аас өгөгдөл татдаг, ОЛОН ФАЙЛТАЙ, бүрэн type hint-тэй, мэргэжлийн бүтэцтэй.
Тэр программд Түвшин 4-ийн БҮХ мэдлэг нэгдэнэ: decorator (Бүлэг 10), HTTP ба requests (Бүлэг 11), package ба модуль (Бүлэг 12). Мөн өмнөх түвшнүүдийн мэдлэг ч бас: dataclass (Бүлэг 9), JSON (Бүлэг 6), type hint (Бүлэг 4).
Тэр бол жинхэнэ мэргэжлийн Python төсөл байх болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.