Hacker News

Python Type Checker чагыштыру: Буш контейнер инференциясе

Аңлатмалар

1 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Ни өчен буш контейнерлар Python тибындагы тикшерүчеләрне сындыралар - һәм сез моның турында нәрсә эшли аласыз

Python-ның әкренләп язу системасы PEP 484 2015-нче елда тип күрсәтмәләрен керткәннән бирле җитлеккән. Бүген миллионлаган уйлап табучылар производствоны җибәргәнче хаталарны тоту өчен статик тип тикшерүчеләргә таяналар. Ләкин тип системасының нечкә, күңелсез почмагы бар, ул хәтта тәҗрибәле инженерларны да йөртә: буш контейнерның нинди төре бар? Сез аннотациясез x = [] язганда, сезнең тикшерүче фаразларга тиеш - һәм төрле тикшерүчеләр төрлечә уйлыйлар. Бу аерма зур код базаларын саклаучы командалар өчен реаль проблемалар тудыра, монда тип тикшерүчеләрне күчү яки берләштерү йөзләгән көтелмәгән хаталарны кичерергә мөмкин.

Бу мәкалә Python тибындагы дүрт төп тикшерүче - мипи, авторлык хокукы, питип һәм пир - буш контейнер инфраструктурасын ничек куллана, ни өчен алар риза түгел, һәм кораллы сайлауга карамастан, куркынычсыз Python язу өчен нинди практик стратегияләр куллана аласыз.

Төп проблема: буш контейнерлар бер-берсенә аңлашылмый

Pythonның бу гаепсез сызыгына игътибар итегез: нәтиҗәләр = [] . нәтиҗәләр a исемлек [int] ? А исемлек [стр] ? А исемлек [диктант [стр, теләсә]] ? Өстәмә контекстсыз, чынлап та белү мөмкинлеге юк. Python эш вакыты мөһим түгел - исемлекләр табигате буенча гетероген - ләкин статик тип тикшерүчеләр үз эшләрен башкару өчен һәр үзгәрүченең конкрет төрен билгеләргә тиеш. Бу Pythonның динамик сыгылмасы һәм статик анализ бирергә тырышкан гарантияләр арасында төп киеренкелек тудыра.

Проблема сүзлекләр һәм комплектлар белән кушыла. Буш {} асылда синтаксик аңлашылмаучанлык өстәгән комплект түгел, ә дикт дип анализлана. Nәм ояланган контейнерлар - уйлагыз defaultdict (исемлек) яки нәтиҗәләр = {k: [] ачкычлары өчен k} - двигательләрне чикләренә этәрегез. Eachәрбер төр тикшерүче үз эвуристикасын үстерде, һәм аермалар күпчелек уйлап табучылар аңлаганнан мөһимрәк.

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

Mypy: Күчерелгән инфраструктура

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

Шулай да, mypy тәртибе контекстка һәм катгыйлык көйләүләренә карап кискен үзгәрә. Модуль масштабында (югары дәрәҗәдәге код), яисә контейнер популяр булганчы бүтән функциягә күчерелгәндә, mypy еш исемлеккә [Any] га кире кайта. - катлаулы флагы астында бу хата җибәрә, ләкин килешү режимында ул тавышсыз уза. Димәк, каты режимсыз мипи белән эшләүче командалар дистәләгән тулы типтагы контейнерлар туплый ала, алар тип системасыннан качу ролен үтиләр, аның максатын җиңәләр.

Бер аеруча нечкә тәртип: 0.990 елга кадәр булган mypy версияләре кайвакыт исемлек [билгесез] ны кертә, аннары биремдә исемлеккә [теләсә нинди] киңәйтеләчәк. 0.990-дан соң, инфраструктура көчәйтелде, ләкин үзгәртү реаль дөнья кодексларын гаҗәпләндерде, алар рөхсәтсез тәртипкә таянганнар. Бу кабатлана торган тема - буш контейнер инфраструктурасына үзгәрешләр иң күп бозучы тип тикшерүчеләр арасында, чөнки үрнәкләр бик киң таралган.

Авторлык хокукы: катгый инференция һәм "билгесез" тип

Майкрософт тарафыннан эшләнгән һәм Pylance VS кодында эшләнгән авторлык, бөтенләй башка фәлсәфи позиция ала. Тыныч кына теләсә нинди ка кире кайту урынына, авторлык хокукы билгесез (әле билгеләнмәгән төр) һәм теләсә нинди (төрне тикшерүдән баш тарту) арасында аерыла. Авторлык хокукының катгый режимында x = [] язганда, ул исемлекне [билгесез] кертә һәм диагностика турында хәбәр итә, сезне аннотация бирергә мәҗбүр итә.

Авторлык хокукы шулай ук масштабта таралу турында агрессив. Язсагыз:

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

Бу ике яклы инфраструктура (алдагы куллануны да, шалтырату сайтларыннан көтелгән төрләрне дә кулланып) буш контейнерлар өчен мипиягә караганда авторлык хокукын төгәлрәк итә. Сәүдә нәтиҗәләре - ачык сүз: миграциянең катгый режимы белән чагыштырганда, авторның катгый режимы типик билгесез код базасында якынча 30-40% күбрәк проблемалар флаглары, ачык чыганак миграция докладлары анализы буенча. Комплекслы арткы системалар төзүче командалар өчен - әйтик, CRM, хезмәт хакы һәм аналитика белән бәйләнгән 207 үзара бәйләнгән модульләр белән идарә итүче платформа - авторлык хокукының катгыйлыгы йомшак интерфейсның туры килмәвен тота, йомшак инфраструктура сагыныр.

Пайтип һәм Пир: Азрак сәяхәт ителгән юллар

Google питипы, мөгаен, иң прагматик алымны ала. Аннотацияләр таләп итү яки теләсә нинди ка кире кайту урынына, пайтип контейнерның функция чикләрендә ничек кулланылуын күзәтү өчен бөтен программа анализы куллана. Әгәр сез бер функциядә буш исемлек булдырсагыз һәм аны бөтен саннарны кушкан икенчесенә бирсәгез, питип еш кына аннотацияләрсез исемлекне [int] кертә ала. Бу кросс-функция инфраструктурасы исәпләү өчен кыйммәт - питип мипка яки эре код базаларында авторлык хокукына караганда әкренрәк - ләкин ул билгесез кодта азрак позитив чыгара.

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 тәртибенә якынрак, ләкин катырак дефолтлар белән. Пир х = [] ны исемлек [билгесез] дип саный һәм күпчелек контекстта аңлатма таләп итә. Пир үзен дифференциацияләгән урында, kwargs буларак кулланылган буш сүзлек литераллары - веб-рамкаларда киң таралган үрнәк. Пирның төп сүз логикасы бар, төп сүз аргумент контекстыннан сүзлек төрләрен табу, катлаулы код базаларында аннотация йөген киметү. Заманча веб-кушымталарның конфигурация һәм сорау белән эш итү өчен сүзлек ачу авыр кулланылуын исәпкә алсак, бу прагматизм дивидендлар түли.

Реаль дөнья йогынтысы: Инференциаль аерма тешләгәндә

Тип тикшерүчеләр арасындагы аермалар, сез аларны җитештерү коды базасында кичергәнче академик булып күренергә мөмкин. Бизнес кушымталарында уртак үрнәкне карагыз: шартлы рәвештә урнашкан мәгълүмат структурасын башлау.

Иң куркыныч буш контейнерлар шкаф флагы түгел - алар тавышсыз тавыш белән Теләсә нинди тибы белән үтеп керәләр, бер-берсенә туры килми торган мәгълүмат тупланмыйча, түбән агым функциясе эш вакытында TypeError белән килеп чыкканга кадәр мөмкин түгел.

Конкрет мисал: финтех стартап командасы өч көн җитештерү проблемаларын чишү өчен чыгымнар турында хәбәр иттеләр , түләү эшкәртү функциясендә башланган буш исемлек, мипи тарафыннан исемлек [Теләсә нинди] дип аталган. Исемлектә валюта күләме өчен дистә объектлары булырга тиеш иде, ләкин аның урынына код юлы йөзү кыйммәтләрен өстәде. Мипиның йомшак карашы аңа тыныч кына рөхсәт итте. Хата йөзү арифметикасында түгәрәк хаталар 12000 счет-фактура партиясендә $ 0.01 туры килмәгәндә барлыкка килде. Әгәр дә алар авторлык хокукын катгый режимда кулланган булсалар, яки буш исемлекне исемлек [Дистәләр] дип аңлатсалар, хата үсеш вакытында тотылган булыр иде.

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

Оборона контейнерын башлау өчен иң яхшы практикалар

Сезнең команда нинди төр тикшерүче кулланса да, буш контейнерның аңлашылмаучанлыгын бетерү өчен конкрет стратегияләр бар. Максат - буш контейнерлар өчен беркайчан да таянмаска - төрне ачык итеп күрсәтегез, шуңа күрә сезнең кодыгыз барлык тикшерүчеләр арасында күчерелмә һәм версияләр арасындагы тәртип үзгәрүенә иммунитет.

  1. alwaysәрвакыт буш контейнер үзгәрүләрен аңлатып бирегез. нәтиҗәләр языгыз: нәтиҗәләр = [] урынына [int] = [] языгыз. Сакланган көйләү вакыты белән чагыштырганда, кечкенә сүзнең бәясе бик аз. Бу бердәнбер практика буш контейнерның якынча 80% проблемаларын бетерә.
  2. Катлаулы контейнерлар өчен завод функцияләрен кулланыгыз. Кайту тибындагы аннотация максатлы типны бертөрле һәм үз-үзен документлаштыра.
  3. Тип язылган конструкторларны вак-төяк булмаган төрләр өчен литераллардан өстен күрегез. Килешү һәм Counter өчен һәрвакыт тип параметрын бирегез: саный: Counter [str] = Counter () .
  4. Яңа код өчен тип тикшерүчегезнең катгый режимын конфигурацияләгез. Мирас кодын әкренләп күчергәндә яңа модульләрне катгый тикшерергә рөхсәт итегез. Бу яңа типтагы контейнерлар тупларга комачаулый.
  5. Сезнең CI үткәргечегезгә тип тикшерүчене чагыштырыгыз. Әгәр дә үрнәк бер тикшерүчедән узса, икенчесен үтәмәсә, бу төрнең ачык булмаганын күрсәтүче сигнал.

Зуррак рәсем: Команда практикасы буларак тикшерүне языгыз

Буш контейнерлар ахыр чиктә Python тип системасында зуррак проблема микрокосмиясе: уңайлык һәм куркынычсызлык арасындагы киеренкелек. Питонның "без барыбыз да олыларга риза" фәлсәфәсе прототип һәм сценарийлар өчен бик яхшы эшли, ләкин меңләгән кулланучыларга хезмәт күрсәтүче җитештерү системалары көчлерәк гарантияләргә мохтаҗ. Дүрт төп тикшерүче [] тибындагы төп нәрсә турында риза булмаулары Python язу экосистемасының әле дә өлгергәнен күрсәтә.

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

PEP 696 (килешү тип параметрлары) һәм PEP 695 (тип параметр синтаксисы) яңа Python версияләренә төшүен дәвам иткәндә, ачык язу эргономикасы яхшырачак. "Аннотацияләнгән" һәм "искәртелмәгән" Python арасындагы аерма таралачак. Ләкин ул көнгә кадәр, ачык контейнер төрләре Python эшкәртүче кораллар җыелмасында иң югары ROI практикаларының берсе булып кала - кечкенә дисциплиналар, һәр модуль, һәр спринт һәм һәр производствода кызыксыну уята торган кечкенә дисциплиналар.

Бүген сезнең бизнес ОСны төзегез

Фрилансерлардан алып агентлыкларга кадәр, Mewayz 207 интеграль модульле 138,000+ бизнеска вәкаләт бирә. Ирекле эшләгез, үскәч яңартыгыз.

{"@ контекст": "https: \ / \ / schema.org", "@ тип": "Сораулар", "mainEntity": 207 интеграль модульләр, бушлай башлагыз, үскәч яңартыгыз. "}}]}

Еш бирелә торган сораулар

Ни өчен тикшерүчеләр буш исемлек төре турында килешә алмыйлар?

"x = []" язганда, тип тикшерүче типны ачык күрсәтмичә күрсәтергә тиеш. Төрле тикшерүчеләр төрле стратегияләр кулланалар: кайберәүләр "исемлек" теләсә нинди "(теләсә нәрсә исемлеге), калганнары" исемлек [юк] "кебек төгәл, ләкин дөрес булмаган төрне күрсәтергә мөмкин. Бу универсаль стандартның булмавы ни өчен риза түгел. Берничә тикшерүче кулланган проектлар өчен бу туры килмәү зур баш авыртуы булырга мөмкин, бер коралда анализны икенчесенә күчерә.

Буш контейнер хаталарын төзәтүнең иң гади ысулы нинди?

Иң туры чишелеш - ачык типтагы аннотация бирү. "My_list = []" урынына, "my_list: list [str] = []" языгыз, максатны ачык игълан итү. Бу тип тикшерүче өчен бөтен аңлашылмаучанлыкны бетерә, mypy, P Copyright, Pyre кебек төрле кораллар арасында эзлекле тәртипне тәэмин итә. Бу практика барлык буш контейнер инициализацияләре өчен тәкъдим ителә, хаталарны булдырмас өчен.

Мин буш контейнерларны класс билгеләмәләре белән ничек эшләргә?

Бу гадәти проблема, чөнки класс эчендә аннотацияләр махсус эшләнүне таләп итә. Сез "__future__ импорт аннотацияләреннән" импортны яки "ClassVar" аннотациясен кулланырга тиеш, әгәр исемлек класс атрибуты булырга тиеш булса. Мәсәлән, "класс MyClass: my_list: ClassVar [исемлек [str]] = []". Ансыз, тип тикшерүче хатаны китереп, төрне дөрес белү өчен көрәшергә мөмкин.

Зур проектларда бу язу проблемаларын идарә итәр өчен кораллар бармы?

Әйе, авторлык кебек алдынгы типтагы тикшерүчеләр (VS Code-та Pylance-ны эшли) катлаулы инфраструктура белән эш итүдә аеруча оста. Зур код базалары өчен Mewayz кебек платформалар (207 анализ модулын $ 19 / айга тәкъдим итә) тирәнрәк, эзлекле төр тикшерүне тәэмин итә ала һәм мәкаләдә каралган каршылыкларны йомшартып, бөтен командагызда аннотация практикаларын кулланырга булыша ала.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime