Hacker News

Python Type Checker Comparison: Empty Container Inference

Comments

12 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Fa maninona ny fitoeran-javatra foana no manapaka ny mpitsikilo karazana Python - ary inona no azonao atao momba izany

Ny rafitra fanoratana tsikelikely an'i Python dia efa matotra be hatramin'ny nampidiran'ny PEP 484 karazana toro-hevitra tamin'ny taona 2015. Ankehitriny, mpamorona an-tapitrisany no miantehitra amin'ny mpitsikilo static mba hisambotra bibikely alohan'ny hamoahana azy. Saingy misy zorony manjavozavo sy mahasosotra amin'ny rafitra karazana izay mbola manenika na dia ireo injeniera efa za-draharaha aza: karazana inona no ananan'ny kaontenera foana? Rehefa manoratra x = [] tsy misy fanamarihana ianao dia tsy maintsy maminavina ny mpitsikilo karazana anao — ary ny mpitsikilo samihafa dia maminavina hafa. Ity tsy fitovizan-kevitra ity dia miteraka olana tena izy ho an'ireo ekipa mitazona codebases lehibe, izay ahafahan'ny fanovana na fampifangaroana karazana checker mety hipoitra fahadisoana an-jatony tsy ampoizina mandritra ny alina.

Ity lahatsoratra ity dia mamaritra ny fomba itondran'ireo mpitsikilo karazana Python efatra lehibe — mypy, pyright, pytype, ary pyre — ny famintinana fitoeran-javatra tsy misy na inona na inona, ny antony tsy hitovizan'izy ireo, ary ny paikady azo ampiasaina hanoratana Python tsy misy dikany na inona na inona safidinao.

Ny olan'ny fototra: Ny kaontenera poakaty dia tsy mazava loatra

Hevero ity andalana tsy misy dikany an'i Python ity: valiny = []. valiny ve lisitra[int]? Lisitra[str]? Lisitra[dict[str, Any]]? Raha tsy misy contexte fanampiny dia tsy misy fomba ahafantarana marina. Ny Python runtime dia tsy miraharaha - ny lisitra dia tsy mitovy amin'ny natiora - fa ny mpitsikilo karazana static dia mila manendry karazana mivaingana amin'ny fari-piainana rehetra hanaovana ny asany. Izany dia miteraka fihenjanana fototra eo amin'ny flexibilité dynamique an'i Python sy ny antoka fa ezahan'ny famakafakana static omena.

Ny olana dia mitambatra amin'ny rakibolana sy andiana. Ny {} tsy misy na inona na inona dia voasokajy ho dikta, fa tsy set, izay manampy ny tsy fahampian'ny syntactic an-tampon'ny ambiguity ambaratonga karazana. Ary ny kaontenera misy akany — eritrereto defaultdict(lisitra) na valiny = {k: [] ho an'ny k ao amin'ny fanalahidin'ny lakile — manosika ny motera fanatsoahan-kevitra mankany amin'ny fetrany. Ny mpitsikilo karazana tsirairay dia namolavola heuristika manokana, ary ny fahasamihafana dia lehibe kokoa noho ny fantatry ny ankamaroan'ny mpamorona.

Ao amin'ny rafi-pamokarana fanodinana ny enta-mavesatra tena izy — na CRM mitantana ny firaketana mpanjifa izany, na maodely faktiora mamokatra entana an-dalana, na metrika manangona fantsona famakafakana — ireo fitoeran-javatra tsy misy na inona na inona miseho ho toy ny lamina fanombohana. Ny famadihana ny karazany dia tsy miteraka fampitandremana fotsiny; afaka manafina ireo bibikely tena izy izay miditra amin'ny fotoana fiasana.

Mypy: Inference nahemotra miaraka amin'ny implicit rehetra

Mypy, ilay mpitsikilo karazana Python tranainy indrindra sy eken'ny besinimaro indrindra, dia manao fomba malefaka amin'ny kaontenera foana. Rehefa mifanena amin'ny x = [] amin'ny sehatry ny asa izy dia manandrana manemotra ny fanapahan-kevitra karazana ary manatsoaka ny karazana singa avy amin'ny fampiasana manaraka. Raha manoratra x = [] ianao arahin'ny x.append(42), ny mypy dia hanatsoaka lisitra[int]. Ity paikadin'ny "join" ity dia miasa tsara amin'ny tranga mahitsy izay ahitana ny kaontenera ao anatin'ny faritra mitovy.

Na izany aza, miova be ny fihetsik'i mypy arakaraka ny toe-javatra sy ny henjana. Amin'ny sahan'ny môdely (kaody ambony indrindra), na rehefa ampitaina amin'ny asa hafa ny kaontenera alohan'ny hamenoana azy, dia matetika miverina amin'ny lisitra[Any] ny mypy. Eo ambanin'ny saina --strict dia miteraka hadisoana izany, fa amin'ny fomba mahazatra dia mandalo mangina. Midika izany fa ireo ekipa mihazakazaka mypy tsy misy fomba hentitra dia afaka manangona kaontenera am-polony mifono an-kolaka izay miasa ho toy ny foy mandositra amin'ny rafitra karazana, ka mandresy ny tanjony.

Fihetseham-po iray manokana: ny dikan-teny mypy talohan'ny 0.990 indraindray dia manondro lisitra[Tsy fantatra] ao anatiny ary avy eo dia mivelatra mankany amin'ny lisitra[Any] amin'ny fanendrena. Taorian'ny-0.990, dia nohamafisina ny fanatsoahan-kevitra, fa ny fanovana dia nandrava andiana codebases tena izy izay niantehitra tamin'ny fitondran-tena mamela nefa tsy tonga saina. Lohahevitra miverimberina ity — ny fiovana amin'ny fanatsoahan-kevitra kaontenera tsy misy na inona na inona dia anisan'ireo fanavaozana mpanara-maso karazana manelingelina indrindra satria miparitaka eny rehetra eny ny lamina.

Pyright: Inference henjana sy ny karazana "Tsy fantatra"

Pyright, novolavolain'i Microsoft ary manapaka an'i Pylance ao amin'ny VS Code, dia manana filôzôfika hafa tanteraka. Raha tokony hiverina mangina amin'ny Any, pyright dia manavaka ny Tsy fantatra (karazana mbola tsy voafaritra) sy ny Any (fanilihana mazava amin'ny fanamarinana karazana). Rehefa manoratra x = [] amin'ny fomba hentitra an'ny pyright ianao, dia mampiditra lisitra[Tsy fantatra] ary mitatitra diagnostika, manery anao hanome fanamarihana.

Ny Pyright koa dia mahery setra kokoa amin'ny fihenam-bidy ao anatin'ny sehatra. Raha manoratra ianao:

  • x = [] arahin'ny x.append("hello") — pyright dia mampiditra lisitra[str]
  • x = [] arahin'ny x.append(1) avy eo x.append("hello") — pyright dia mampiditra lisitra[int | str
  • x = [] dia nandalo mivantana tamina asa miandry lisitra[int] — pyright dia manatsoaka lisitra[int] avy amin'ny contexte-tranonkala
  • x = [] niverina avy amina asa tsy misy fanamarihana karazana fiverenana — pyright dia mitatitra fahadisoana fa tsy maminavina

Ity fanatsoahan-kevitra roa tonta ity (mampiasa ny fampiasana manaraka sy ny karazana andrasana avy amin'ny tranokala antso) dia mahatonga ny pyright ho marimarina kokoa noho ny mypy ho an'ny kaontenera foana. Ny fifampiraharahana dia verbosity: ny fomba henjana an'i pyright dia manefa eo amin'ny 30-40% bebe kokoaao amin'ny codebase mahazatra tsy voamarika raha ampitahaina amin'ny fomba henjana an'i mypy, araka ny famakafakana avy amin'ny tatitra fifindra-monina misokatra maro. Ho an'ny ekipa manangana rafitra saro-pady any aoriana — ohatra, sehatra iray mitantana ireo môdely 207 mifamatotra amin'ny CRM, taratasin-karama ary analyse — ny hamafin'ny pyright dia mahasarika tsy mifanandrify amin'ny interface tsara izay tsy ho azon'ny fanatsoahan-kevitra mora.

Pytype sy Pyre: Ireo lalana tsy dia nandeha loatra

Ny pytype an'i Google angamba dia maka fomba fanao mahazatra indrindra. Raha tokony hitaky fanamarihana na miverina amin'ny Any, ny pytype dia mampiasa fandalinana ny programa manontolo hanaraha-maso ny fomba ampiasana fitoeran-javatra iray manerana ny sisin-tanin'ny asa. Raha mamorona lisitra tsy misy na inona na inona ianao amin'ny asa iray ary mampita izany amin'ny iray hafa izay mampiditra integer, ny pytype dia matetika afaka manondro lisitra[int] tsy misy fanamarihana mihitsy. Vidin'ny kajy ity famintinana ity - ny pytype dia miadana kokoa noho ny mypy na pyright amin'ny codebases lehibe - saingy vitsy kokoa ny vokatra diso amin'ny code tsy voamarika.

Pytype koa dia mampiditra ny hevitry ny "karazana ampahany" ho an'ny fitoeran-javatra tsy misy na inona na inona. Ny [] vao noforonina dia mahazo karazana ampahany izay voadio tsikelikely rehefa mihaona amin'ny fampiasana bebe kokoa ny mpitsikilo. Kanto amin'ny foto-kevitra ity saingy afaka miteraka hafatra diso mampisafotofoto rehefa tsy voavaha tanteraka ilay karazana ampahany, toy ny rehefa misy kaontenera tsy misy na inona na inona mikoriana amin'ny asa maro nefa tsy misy mponina.

💡 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 →

Meta's pyre, mandritra izany, dia manakaiky kokoa ny fihetsik'i mypy saingy miaraka amin'ny default kokoa. Pyre dia mandray ny x = [] ho lisitra[tsy fantatra] ary mitaky fanamarihana amin'ny ankamaroan'ny toe-javatra. Ny maha-samihafa ny pyre dia eo amin'ny fitantanany ny rakibolana poakaty ampiasaina ho kwargs — lamina mahazatra amin'ny rafitra tranonkala. Pyre dia manana lojikan'ny tranga manokana hamaritana ny karazana rakibolana avy amin'ny contexte arguments keyword, mampihena ny enta-mavesatry ny fanamarihana ao amin'ny framework-heavy codebases. Raha jerena fa ny ankamaroan'ny rindranasa amin'ny tranonkala maoderina dia misy fampiasana be dia be ny famoahana rakibolana ho an'ny fikirakirana sy ny fikarakarana ny fangatahana, ity pragmatisma ity dia manome tombony.

Ny fiantraikan'ny zava-misy eo amin'izao tontolo izao: rehefa manaikitra ny tsy fitovian-kevitra

Mety ho toa akademika ny fahasamihafan'ny mpitsikilo karazana mandra-pahitanao azy ireo amin'ny tobin'ny famokarana. Diniho ny lamina mahazatra amin'ny rindranasa fandraharahana: fanombohana firafitry ny angona izay hofenoina fepetra.

Ny kaontenera tsy misy na inona na inona mampidi-doza indrindra dia tsy ireo karazana checkers saina — fa ireo izay mandalo mangina miaraka amin'ny karazana Aiza voatosika, mamela ny angona tsy mifanentana hiangona tsy misy fampitandremana mandra-pahatongan'ny fampandehanana midina midina amin'ny fotoana fampandehanana miaraka amin'ny TypeError izay saika tsy azo averina amin'ny fiaviany.

Ohatra mivaingana: ekipa iray ao amin'ny fanombohana fintech dia nitatitra fa nandany telo andro nanara-maso ny olana momba ny famokarana izay nisy lisitra tsy misy na inona na inona, natomboka tamin'ny asa fanodinana fandoavam-bola, dia noheverin'ny mypy ho lisitra[Any]. Ny lisitra dia tokony ahitana zavatra Decimal ho an'ny sandan'ny vola, fa ny lalan'ny kaody kosa dia nampiana sanda float. Ny fanatsoahan-kevitr'i Mypy dia namela azy mangina. Nipoitra ihany ilay bibikely rehefa nahatonga ny tsy fitovian'ny $0,01 tamin'ny faktiora 12,000 ny famoriam-bola amin'ny kajy mitsingevana. Raha nampiasa pyright tamin'ny fomba henjana izy ireo, na nanamarika fotsiny ny lisitra foana ho lisitra[Decimal], dia ho tratra tamin'ny fotoan'ny fampandrosoana ilay bibikely.

Ao amin'ny Mewayz, izay izoran'ny lampihazo ny faktiora, ny kajy ny karama ary ny famakafakana ara-bola amin'ny kaonty mpampiasa 138,000+, ity karazana hantsana fiarovana ity dia tsy teorika — izany no maha samy hafa ny fandehan'ny karama marina sy ny kajy lafo vidy. Ny fitsipi-pifehezana henjana momba ny fanoratana kaontenera dia iray amin'ireo fomba fanao "mankaleo" izay misoroka ny fisehoan-javatra mampientam-po amin'ny famokarana.

Fomba fanao tsara indrindra amin'ny fanombohana ny kaontenera fiarovana

Na inona na inona karazana mpitsikilo ampiasain'ny ekipanao, dia misy paikady mivaingana hanafoana tanteraka ny tsy fahampian'ny kaontenera. Ny tanjona dia ny tsy hiantehitra na oviana na oviana amin'ny fanatsoahan-kevitra ho an'ny kaontenera tsy misy na inona na inona — ataovy mazava tsara ilay karazana mba ho azo entina eny amin'ny mpitsikilo rehetra ny kaodinao ary tsy ho voan'ny fiovan'ny fitondran-tena eo amin'ny dikan-teny.

  1. Asio sora-baventy foana ny fari-piadidiana poakaty. Soraty valiny: list[int] = [] fa tsy résults = []. Ny vidin'ny verbosity kely dia tsinontsinona raha oharina amin'ny fotoana debug voatahiry. Ity fomba fanao tokana ity dia manafoana ny 80% eo ho eo amin'ny olan'ny fikaonan-doha foana.
  2. Mampiasà fiasan'ny orinasa ho an'ny kaontenera be pitsiny. Raha tokony cache = {} dia manorata fiasa toy ny def make_cache() -> dict[str, list[UserRecord]]: miverina {}. Ny fanamarihan'ny karazana fiverenana dia mahatonga ny karazana kasaina ho tsy misy dikany sy mirakitra an-tsoratra manokana.
  3. Aleo mpanorina voatendry toy izay ara-bakiteny ho an'ny karazana tsy misy dikany. Manorata zavatra: set[int] = set() fa tsy miantehitra amin'ny famintinana ny fahatakarana napetraka. Ho an'ny defaultdict sy Counter dia omeo foana ny masontsivana karazana: isa: Counter[str] = Counter().
  4. Amboary ny fomba henjana an'ny mpitsikilo karazana anao ho an'ny kaody vaovao. Alefaso ny fanaraha-maso henjana amin'ny maody vaovao raha mifindra tsikelikely ny kaody lova. Izany dia manakana ny fivondronan'ireo kaontenera vaovao tsy misy soratra.
  5. Ampio fampitahana karazana checker amin'ny fantsona CI-nao. Raha misy lamina mandalo mpitsikilo iray nefa tsy mahomby iray hafa, dia famantarana fa tsy mazava tsara ilay karazana.

Ny sary lehibe kokoa: Fanamarinana karazana ho toy ny fanazaran'ny ekipa

Ny fanatsoahan-kevitry ny kaontenera poakaty dia microcosm amin'ny fanamby lehibe kokoa amin'ny rafitra karazana Python: ny fihenjanana eo amin'ny fahamendrehana sy ny fiarovana. Ny filôzôfian'i Python hoe "olon-dehibe manaiky daholo isika" dia miasa tsara ho an'ny prototyping sy scripts, saingy mila antoka matanjaka kokoa ny rafitra famokarana manompo mpampiasa an'arivony. Ny fisian'ny mpitsikilo karazany efatra lehibe tsy mitovy hevitra amin'ny zavatra fototra toy ny karazana [] dia manamafy fa mbola mihamatotra ny tontolon'ny fanoratana Python.

Ho an'ny ekipa injeniera manangana sehatra saro-takarina — na mitantana microservice vitsivitsy ianao na rafitra mitambatra miaraka amin'ny maody an-jatony mifamatotra toy ny OS orinasa Mewayz — tsotra ny torohevitra azo ampiharina: aza miantehitra amin'ny fanatsoahan-kevitra ho an'ny kaontenera tsy misy na inona na inona, mifidiana mpitsikilo karazana ary amboary tsara izany, ary ataovy toy ny antontan-taratasy azo hamarinina amin'ny milina. Ny dimy minitra lany amin'ny fanoratana lisitra[Invoice] fa tsy [] dia hamonjy anao ora amin'ny debugging rehefa mizana ny codebase-nao.

Rehefa mbola mipoitra amin'ny dikan-teny Python vaovao ny PEP 696 (karazana mari-pamantarana default) sy PEP 695 (karazana mari-pamantarana marika) dia hihatsara hatrany ny ergonomika amin'ny fanoratana mazava. Hihena ny elanelana misy eo amin'ny Python "annotated" sy "unnotated". Saingy mandra-pahatongan'io andro io, ny karazana kaontenera mazava dia mijanona ho iray amin'ireo fomba fanao ambony indrindra amin'ny ROI ao amin'ny kitapom-pitaovan'ny mpamorona Python — fitsipi-pifehezana kely izay mandoa zanabola mitambatra amin'ny maodely tsirairay, isaky ny sprint, ary isaky ny fandefasana famokarana.

Amboary anio ny OS orinasanao

Avy amin'ny freelancer ka hatramin'ny masoivoho, Mewayz dia manana orinasa maherin'ny 138,000 miaraka amin'ny maody mitambatra 207. Manomboha maimaim-poana, manavao rehefa mitombo ianao.

Mamorona kaonty maimaim-poana →

Fanontaniana matetika

Fa maninona no tsy mifanaraka amin'ny karazana lisitra tsy misy na inona na inona ny checkers type?

Rehefa manoratra `x = []` ianao, ny mpitsikilo karazana dia tsy maintsy manatsoaka karazana tsy misy fanoroana mazava. Mampiasa paika samihafa ny mpikarama samihafa: ny sasany dia mihevitra ny `lisitra[Any]` (lisitra misy na inona na inona), raha ny hafa kosa mety manondro karazana voafaritra kokoa nefa diso toy ny `lisitra[Tsy misy]`. Io tsy fisian’ny fenitra iraisam-pirenena io no tsy ifanarahan’izy ireo. Ho an'ny tetikasa mampiasa mpitsikilo maro, ity tsy fitovian-kevitra ity dia mety ho aretin'andoha lehibe, manapaka ny famakafakana amin'ny fitaovana iray izay mandalo amin'ny iray hafa.

Inona no fomba tsotra indrindra hamahana ny lesoka ao anaty container?

Ny vahaolana tsotra indrindra dia ny fanomezana karazana fanamarihana mazava. Ho solon'ny `my_list = []`, soraty ny `my_list: list[str] = []` mba hanambarana mazava ny karazana tiana. Izany dia manaisotra ny tsy mazava rehetra ho an'ny mpitsikilo karazana, miantoka ny fitondran-tena tsy miovaova amin'ny fitaovana samihafa toa ny mypy, Pyright, ary Pyre. Ity fomba fanao ity dia atolotra ho an'ny fanombohana fitoeran-javatra tsy misy na inona na inona mba hisorohana ny fahadisoana amin'ny famintinana.

Ahoana ny fomba fitantanana ny kaontenera foana ao anatin'ny famaritana kilasy?

Olana mahazatra ity satria mila fikarakarana manokana ny fanamarihana ao anatin'ny kilasy. Tsy maintsy mampiasa ny fanafarana `from __future__ import annotations` na `ClassVar` raha toa ka natao ho toetran'ny kilasy ny lisitra. Ohatra, `class MyClass: my_list: ClassVar[lisitra[str]] = []`. Raha tsy misy izany, dia mety ho sahirana ny mpitsikilo karazana hamantatra tsara ny karazana, ka miteraka hadisoana.

Misy fitaovana hanampy amin'ny fitantanana ireo olan'ny fanoratana amin'ny tetikasa lehibe ve?

Eny, ireo mpitsikilo karazana avo lenta toa an'i Pyright (izay manome hery an'i Pylance ao amin'ny VS Code) dia tena mahay amin'ny fitantanana ny inferences sarotra. Ho an'ny codebases lehibe, ny sehatra toa an'i Mewayz (manolotra maody famakafakana 207 ho an'ny $19/volana) dia afaka manome fanamarinana karazana lalindalina kokoa sy tsy miovaova ary manampy amin'ny fampiharana ny fomba fanaovana fanamarihana manerana ny ekipanao manontolo, manalefaka ny tsy fitovian-kevitra resahina ao amin'ny lahatsoratra.

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

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