Hacker News

Python түрү текшергич салыштыруу: Бош контейнер тыянак

Комментарийлер

2 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Эмне үчүн бош контейнерлер Python түрүндөгү текшергичтерди бузушат — жана бул тууралуу эмне кылсаңыз болот

Pythonдун акырындык менен терүү системасы 2015-жылы PEP 484 түрү боюнча ишараттарды киргизгенден бери кыйла жетилди. Бүгүнкү күндө миллиондогон иштеп чыгуучулар мүчүлүштүктөрдү өндүрүшкө чыга электе кармап калуу үчүн статикалык типтеги текшергичтерге таянышат. Бирок типтүү системанын тымызын, капа кылчу бурчу бар, ал дагы деле тажрыйбалуу инженерлерди кыйнайт: бош контейнердин кандай түрү бар? Аннотациясыз x = [] деп жазганыңызда, тип текшергичиңиз божомолдоого туура келет — жана ар кандай шашкилер башкача божомолдошот. Бул айырмачылык чоң коддук базаларды колдогон командалар үчүн чыныгы көйгөйлөрдү жаратат, мында типти текшерүүчүлөрдү алмаштыруу же айкалыштыруу бир түн ичинде жүздөгөн күтүлбөгөн каталарды жаратышы мүмкүн.

Бул макалада Python тибиндеги төрт негизги текшерүүчү - mypy, pyright, pytype жана pyre - бош контейнердин тыянактары кандайча иштетилери, алар эмне үчүн макул эместиги жана куралды тандооңузга карабастан типке ылайыктуу Python жазуу үчүн кандай практикалык стратегияларды колдонсоңуз болот.

Негизги көйгөй: бош контейнерлер эки ача мааниге ээ

Бул зыянсыз Python линиясын карап көрөлү: натыйжалар = []. натыйжалар тизме[int]би? тизме[str]? тизме[dict[str, Any]]? Кошумча контекстсиз, чынында, билүүнүн эч кандай жолу жок. Python иштөө убактысы эч кандай мааниге ээ эмес — тизмелер табияты боюнча гетерогендүү — бирок статикалык типтеги текшергичтер өз ишин аткаруу үчүн ар бир өзгөрмөгө конкреттүү типти дайындашы керек. Бул Python динамикалык ийкемдүүлүгү менен статикалык талдоо камсыз кылууга аракет кылган кепилдиктердин ортосунда негизги чыңалууну жаратат.

Маселе сөздүктөр жана топтомдор менен кошулат. Бош {} чындыгында дикт катары талданат, топтом эмес, тип деңгээлиндеги эки ачачылыктын үстүнө синтаксистик түшүнүксүздүктү кошот. Ал эми уя салынган контейнерлер — ойлонуңуз defaultdict(list) же результат = {k: [] for k in keys} — тыянак чыгаруу кыймылдаткычтарын чегине чейин түртүңүз. Ар бир текшерүүчү өзүнүн эвристикасын иштеп чыккан жана айырмачылыктар көпчүлүк иштеп чыгуучулар түшүнгөндөн алда канча маанилүү.

Чыныгы жумуш жүгүн иштеткен өндүрүш тутумдарында - бул кардарлардын жазууларын иштеткен CRM болобу, сап элементтерин түзүүчү эсеп-фактура модулу же метрикаларды бириктирүүчү аналитикалык түтүк болобу - бош контейнерлер инициализация үлгүлөрү катары дайыма пайда болот. Алардын түрлөрүн туура эмес алуу жөн гана эскертүүлөрдү бербейт; ал иштөө убактысына өтүп кеткен чыныгы мүчүлүштүктөрдү маска кыла алат.

Mypy: Ар кандай ачык-айкын эмес кийинкиге калтырылган тыянак

Mypy, эң эски жана эң кеңири колдонулган Python тибиндеги текшерүүчү, бош контейнерлерге салыштырмалуу жумшак мамиле кылат. Функциянын алкагында x = [] жолукканда, ал типтин чечимин кийинкиге калтырууга жана кийинки колдонуудан элементтин түрүн чыгарууга аракет кылат. Эгер сиз x = [] анан x.append(42) деп жазсаңыз, mypy list[int] чыгарат. Бул "кошулуу" стратегиясы контейнер бир эле чөйрөдө жайгашкан жөнөкөй учурларда таң калыштуу жакшы иштейт.

Бирок, mypyдин жүрүм-туруму контекстке жана катуулук орнотууларына жараша кескин өзгөрөт. Модуль масштабында (жогорку деңгээлдеги код) же контейнер толтурулганга чейин башка функцияга өткөндө, mypy көбүнчө тизмеге [Кандайдыр бир] кайра түшөт. --strict желегинин астында бул катаны жаратат, бирок демейки режимде ал унчукпай өтөт. Бул катаал режими жок mypy иштеткен командалар тип системасынан качуу люктары катары иштеген ондогон кыйыр түрдө терилген контейнерлерди топтой алат дегенди билдирет.

Бир өзгөчө тымызын жүрүм-турум: 0.990 чейинки mypy версиялары кээде ички тизмени[Белгисиз] чыгарышат, андан кийин тапшырма боюнча тизмеге[Кандай болбосун] кеңейет. 0.990-ден кийин, тыянак күчөдү, бирок өзгөртүү аны түшүнбөстөн уруксат берүүчү жүрүм-турумга таянган таң калыштуу сандагы реалдуу код базаларын сындырды. Бул кайталануучу тема — бош контейнердеги жыйынтыкка өзгөртүүлөр эң үзгүлтүккө учураган текшерүүчү жаңыртуулардын бири болуп саналат, анткени үлгүлөр бардык жерде кездешет.

Pyright: Катуу корутунду жана "Белгисиз" түрү

Майкрософт тарабынан иштелип чыккан жана VS Codeдеги Pylanceти иштеткен Pyright, түп-тамырынан бери башкача философиялык позицияны ээлейт. Кандайдыр бирге унчукпай кайра түшүүнүн ордуна, автордук укук Белгисиз (азырынча аныктала элек түрү) жана Кандай болбосун (тип текшерүүдөн ачык баш тартуу) ортосунда айырмаланат. Сиз автордук укуктун катаал режиминде x = [] деп жазганыңызда, ал тизмени[Белгисиз] чыгарат жана диагностика жөнүндө кабарлап, аннотация берүүгө мажбурлайт.

Pyright ошондой эле колдонуу чөйрөсүн тарытуу жөнүндө дагы агрессивдүү. Эгерде сиз жазсаңыз:

  • x = [] андан кийин x.append("hello") — автордук укук тизме[str]
  • деген жыйынтыкка келет
  • x = [] андан кийин x.append(1) анан x.append("hello") — автордук укук list[int | str]
  • x = [] түздөн-түз list[int] күткөн функцияга өттү — автордук укук чалуу сайтынын контекстинен list[int] жыйынтык чыгарат
  • x = [] кайтаруу түрү аннотациясы жок функциядан кайтарылды — pyright болжолдоонун ордуна ката жөнүндө кабарлайт

Бул эки багыттуу корутунду (кийинки колдонууну да, чалуу сайттарынан күтүлгөн түрлөрүн да колдонуу менен) бош контейнерлер үчүн mypyге караганда pyrightты кыйла так кылат. Бир нече ачык булактагы миграциялык отчеттордун талдоосуна ылайык, талаш-тартыш - бул көп сөз: pyright'тын катуу режими болжол менен 30-40% көбүрөөк маселелерди типтүү аннотацияланбаган код базасында mypyдин катуу режимине салыштырганда. Татаал сервердик системаларды курган командалар үчүн (мисалы, CRM, эмгек акы жана аналитиканы камтыган 207 бири-бири менен байланышкан модулдарды башкарган платформа) - pyright'тын катаалдыгы жумшак тыянак чыгара албай турган тымызын интерфейс дал келбестерин байкайт.

Pytype жана Pyre: Азыраак саякатталган жолдор

Google'дун pytype, балким, эң прагматикалык ыкманы колдонот. Аннотацияларды талап кылуунун же Кандай болбосунга кайра түшүүнүн ордуна, pytype функциянын чектеринде контейнер кандайча колдонулуп жатканын көзөмөлдөө үчүн бүтүн программанын анализин колдонот. Эгер сиз бир функцияда бош тизме түзүп, аны бүтүн сандарды кошкон башкасына өткөрүп берсеңиз, pytype көбүнчө эч кандай аннотациясыз list[int] жыйынтык чыгарышы мүмкүн. Бул кайчылаш-функция тыянак эсептөө үчүн кымбат — pytype чоң коддук базалардагы mypy же pyrightга караганда кыйла жайыраак — бирок аннотацияланбаган коддо жалган позитивдерди азыраак чыгарат.

Pytype ошондой эле бош контейнерлер үчүн "жарым-жартылай түрлөрү" түшүнүгүн киргизет. Жаңы түзүлгөн [] жарым-жартылай түрүн алат, ал бара-бара такталып, текшергич көбүрөөк колдонууга туш болот. Бул концептуалдык жактан көрктүү, бирок жарым-жартылай түрүн толук чечүүгө мүмкүн болбогондо, мисалы, бош контейнер эч качан толтурулбастан бир нече функциялар аркылуу агып өткөндө, башаламан ката билдирүүлөрүн жаратышы мүмкүн.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

Метанын пири, ошол эле учурда, mypyдин жүрүм-турумуна жакыныраак, бирок демейки катаалыраак. Pyre x = [] тизме[белгисиз] катары карайт жана көпчүлүк контексттерде аннотацияны талап кылат. Пиренин айырмаланган жери анын кварг катары колдонулган бош сөздүк литералдарын иштетүүдө — веб алкактарда кеңири таралган үлгү. Pyre ачкыч аргумент контексттеринен сөздүк түрлөрүн чыгаруу үчүн атайын логикага ээ, бул алкактык оор код базаларында аннотация жүгүн азайтат. Көпчүлүк заманбап веб-тиркемелер конфигурациялоо жана суроо-талаптарды иштетүү үчүн сөздүктү ачууну көп колдонууну талап кылаарын эске алсак, бул прагматизм дивиденддерди төлөйт.

Чыныгы дүйнөгө тийгизген таасири: тыянак чаккан кезде

Типтүү текшерүүчүлөрдүн ортосундагы айырмачылыктар сиз аларды өндүрүш код базасында байкамайынча академиялык көрүнүшү мүмкүн. Бизнес колдонмолорунда кеңири таралган үлгүнү карап көрөлү: шарттуу түрдө толтурулган маалымат структурасын инициализациялоо.

Эң кооптуу бош контейнерлер текшерүүчү желекче түрү эмес — алар болжолдуу Кандай болбосун түрү менен унчукпай өтүп кетүүчү контейнерлер болуп саналат, алар ылдыйкы агымдагы функция иштөө убагында кыйроого учурамайынча, туура келбеген маалыматтарды эскертүүсүз чогултууга мүмкүндүк берет.

Конкреттүү мисал: финтех стартапынын командасы өндүрүштүк көйгөйдү оңдоого үч күн сарптаганын билдирди, мында төлөмдү иштетүү функциясында инициализацияланган бош тизме mypy тарабынан тизме[Кандайдыр бир] деп кабыл алынган. Тизме валюталык суммалар үчүн Ондукобъектилерди камтышы керек болчу, бирок код жолу анын ордуна флоат маанилерин кошуп жаткан. Mypy-дун жумшак корутундусу унчукпай жол берди. Ката калкып чыгуу арифметикасындагы тегеректөө каталары 12 000 эсеп-фактуранын партиясында $0,01 дал келбестигин пайда кылганда гана пайда болду. Эгер алар автордук укукту катуу режимде колдонушканда же бош тизмеге тизме[Ондук] деп жөн гана аннотация беришсе, ката иштеп чыгуу учурунда байкалмак.

Мевейзде, платформа 138,000+ колдонуучу каттоо эсептери боюнча эсеп-фактураларды, эмгек акыны эсептөөлөрдү жана каржылык аналитиканы иштетет, бул типтеги коопсуздук ажырымы теориялык эмес — бул эмгек акыны туура эсептөө менен кымбат баалуу кайра эсептөөлөрдүн ортосундагы айырма. Контейнерди инициализациялоодо катуу терүү тартиби кызыктуу өндүрүштүк инциденттерди алдын алган "тажатма" инженердик практикалардын бири.

Коргонуу контейнерин инициализациялоо боюнча мыкты тажрыйбалар

Командаңыз кайсы түрдөгү текшергичти колдонгонуна карабастан, бош контейнердеги түшүнүксүздүктү толугу менен жок кылуу үчүн конкреттүү стратегиялар бар. Максаты – бош контейнерлер үчүн эч качан жыйынтыкка ишенбөө — кодуңуз бардык текшерүүчүлөрдө көчмө жана версиялар ортосундагы тыянак чыгаруу аракеттерине каршы туруу үчүн түрүн ачык кылыңыз.

<ол>
  • Дайыма бош контейнер өзгөрмөлөрүнө аннотация калтырыңыз. натыйжалар = [] ордуна натыйжалар: list[int] = [] деп жазыңыз. Сакталган мүчүлүштүктөрдү оңдоо убактысына салыштырмалуу анча-мынча кенен чыгым. Бул бир эле практика бош контейнердин тыянак чыгаруу маселелерин болжол менен 80% жок кылат.
  • Татаал контейнерлер үчүн заводдук функцияларды колдонуңуз. кэш = {} ордуна, def make_cache() -> dict[str, list[UserRecord]] сыяктуу функцияны жазыңыз: return {}. Кайтаруу түрүнүн аннотациясы болжолдонгон түрдү бир түшүнүктүү жана өзүн-өзү документтештирүүчү кылат.
  • Тривиалдык эмес түрлөр үчүн литералдарга караганда терилген конструкторлорго артыкчылык бериңиз. Топтукту түшүнүү боюнча жыйынтыкка таянбастан, items: set[int] = set() деп жазыңыз. defaultdict жана Counter үчүн ар дайым түр параметрин бериңиз: эсептөө: Counter[str] = Counter().
  • Жаңы код үчүн тип текшергичиңиздин катуу режимин конфигурациялаңыз. mypy жана pyright экөө тең ар бир файл же ар бир каталог конфигурациясын колдойт. Эски кодду акырындык менен көчүрүү учурунда жаңы модулдарды катуу текшерүүнү иштетиңиз. Бул жаңы кыйыр түрдө терилген контейнерлердин топтолушуна жол бербейт.
  • Типти текшерүүчү салыштырууну CI түтүкчөңүзгө кошуңуз. Код базасында mypy жана pyright экөөнү тең иштетүү, тыянак чыгаруунун айырмасын эрте байкайт. Эгерде үлгү бир текшергичтен өтүп, бирок экинчи текшерүүдөн өтпөй калса, бул түрү жетиштүү түрдө ачык-айкын эмес деген белги.
  • Чоңураак сүрөт: Команда катары текшерүү

    Бош контейнерден жыйынтык чыгаруу Python тибиндеги системадагы чоңураак көйгөйдүн микрокосмосу: ыңгайлуулук менен коопсуздуктун ортосундагы тирешүү. Python'дун "баарыбыз чоңдорго макулбуз" деген философиясы прототиптөө жана скрипттер үчүн сонун иштейт, бирок миңдеген колдонуучуларды тейлеген өндүрүш системалары күчтүү кепилдиктерге муктаж. Төрт негизги типтеги текшерүүчүнүн [] түрү сыяктуу негизги нерсе боюнча макул эместиги Python терүү экосистемасынын дагы эле жетилип келе жатканын баса белгилейт.

    Татаал платформаларды куруп жаткан инженердик командалар үчүн - сиз бир нече микросервистерди же Mewayz бизнес OS сыяктуу жүздөгөн бири-бири менен байланышкан модулдарды башкарып жатасызбы - практикалык кеңеш жөнөкөй: бош контейнерлер үчүн тыянакка ишенбеңиз, типти текшергичти тандап, аны катуу конфигурациялаңыз жана документтердин түрүн машинанын болушу мүмкүн эмес деп эсептеңиз. [] ордуна тизме[Инвойс] жазууга сарпталган беш мүнөт коддук базаңыз масштабдуу болгондо мүчүлүштүктөрдү оңдоого бир нече саатты үнөмдөйт.

    PEP 696 (демейки тип параметрлери) жана PEP 695 (тип параметринин синтаксиси) Pythonдун жаңы версияларына түшүүнү уланткан сайын, ачык терүүнүн эргономикасы жакшыра берет. "Аннотацияланган" жана "аннотацияланбаган" Python ортосундагы ажырым кыскарат. Бирок ошол күнгө чейин ачык контейнер түрлөрү Python иштеп чыгуучунун куралдар топтомундагы эң жогорку ROI практикаларынын бири бойдон калууда — бул ар бир модулда, ар бир спринтте жана ар бир өндүрүштү жайылтууда татаал пайыздарды төлөгөн кичинекей дисциплин.

    Бүгүнкү күндө бизнесиңизди түзүңүз

    Фрилансерлерден агенттиктерге чейин, Mewayz 207 интеграцияланган модулу менен 138,000+ бизнеске ыйгарым укуктарды берет. Акысыз баштаңыз, чоңойгондо жаңыртыңыз.

    Акысыз каттоо эсебин түзүү →