Ar reikia naudoti griežtą „Python“ kompiliatorių?

Yra „Python“ statinių analizės įrankių , tačiau kompiliavimo laiko patikrinimai paprastai yra visiškai priešingi „Python“ apimančio veikimo laiko susiejimo filosofijai . Galite naudoti standartinį „Python“ interpretatorių, naudodami statinį analizės įrankį tam, kad vykdytumėte tam tikrus griežtus apribojimus, tačiau nematome tokio plataus masto pripažinimo.

Ar yra kas nors apie „Python“, dėl kurio „naudoti griežtus“ veiksmus nereikalinga ar ypač nepageidaujama?

Arba, „Perl“ nepaisant to, kad jis plačiai naudojamas, nebūtina naudoti „griežto“ elgesio?

Pastaba „Būtina“, aš turiu galvoje „praktiškai reikalingą“, o ne būtinai. Akivaizdu, kad galite rašyti „Perl“ be „griežto naudojimo“, bet (iš to, ką mačiau), dauguma „Perl“ programuotojų tikrai jį naudoja.

Pastaba „Python“ vertėjo žodžiu nereikia „naudoti griežtus“, panašius į apribojimus - galite naudoti pseudo-pragma, panašią į „naudoti griežtą“, kurią reguliarus vertėjas ignoruos. Aš nekalbu apie kalbos lygio funkcijos pridėjimą.


Atnaujinti. Paaiškinimas, ką „Perl“ naudoja „griežtai“. (Nuoroda į oficialius dokumentus pateikta pirmojoje pastraipoje.)

Direktyvoje „naudoti griežtą“ yra trys skirtingi komponentai, iš kurių tik du yra tikrai įdomūs:

  • naudoti griežtus vars: statiškai tikrina kintamojo naudojimą leksiniame domene jūsų programoje. (Atkreipkite dėmesį, kad „Python“ yra tik global apimtis ir local taikymo sritis). Daugelis „Python“ lapų tai patikrina. Kadangi tai yra vienintelė statinė analizė, kurią jie gali padaryti, spąstai daro prielaidą, kad naudojate tiesioginę leksinę taikymo sritį ir įspėjate apie tai, kas šiuo požiūriu atrodo neteisinga, kol pasakysite jiems, kad jie užsidaro; tai yra.

     FOO = 12 foo += 3 

    Jei nieko nedarote su savo vardų erdvėmis, tai gali būti naudinga tikrinant rašymo klaidas.

  • Naudokite stiprius ryšius: neleidžia atskleisti simbolinės vardų erdvės. Artimiausias „Python“ analogas naudoja locals() ir globals() kad atliktų simbolinius globals() ir surastų identifikatorių.

  • naudoti griežtus subtitrus: Python'e nėra jokio realaus ekvivalento.

30
05 марта '09 в 5:08 2009-03-05 05:08 cdleary yra nustatytas kovo 05 '09, 05:08 2009-03-05 05:08
@ 12 atsakymų

„Ritono privalomasis filosofija, kurią apima„ Python “..., nereikalingai naudoja„ griežtą “elgesį [ir] ypač nepageidautiną“

Gana gera santrauka. Ačiū.

Iš esmės tai yra. Statiniai analizės įrankiai nepadeda „Python“ tiesiog stovėti.


Redaguoti

„Aš prašau, kad mes suprastume, kodėl mums to nereikia, ir kodėl Perl programuotojai mano, kad jiems jų reikia.“

Priežastis, kodėl ją davėte. Mums to nereikia, nes tai nepadeda. Akivaizdu, kad jums nepatinka šis atsakymas, tačiau vis tiek nieko nereikia pasakyti. Tikrinant kompiliavimo ar iš anksto parengtą laiką tiesiog nepadeda.

Tačiau, kadangi jums teko laiko vėl užduoti klausimą, pateiksiu daugiau įrodymų, kad jūs jau pateikėte atsakymą.

Aš parašau „Java“ beveik taip pat, kaip rašau „Python“. Statinio „Java“ tipo tikrinimas netrukdo loginėms problemoms; tai nepadeda patenkinti reikalavimų; Tai nepadeda patenkinti naudojimo atvejų. Ji net nesumažina vieneto bandymų.

Nors statinis tipo patikrinimas rodo atsitiktinį netinkamą metodo naudojimą, Python rasite jį taip pat greitai. „Python“ rasite jį vieneto teste, nes jis neveiks. Pastaba: nesakau, kad daugybė protingų vienetų testų yra neteisingi tipai, sakau, kad netinkamų tipų problemos yra aptiktos neišlaikytomis išimtimis, kai viskas neužtenka, kad patvirtintų teiginius.

Pythonistas nepanaudoja laiko statiniam tikrinimui. Mums to nereikia. Tai neduoda jokios vertės. Tai analizės lygis, neturintis ekonominės naudos. Tai nepadeda man labiau išspręsti realių problemų, su kuriomis susiduria realūs duomenys, problemas.

Pažvelkite į populiariausius SO Python klausimus, susijusius su kalba (ne probleminis domenas ar biblioteka).

Ar yra skirtumas tarp „foo yra Nėra“ ir „ir“ ir „foo == Nėra“, - == ir is . Nėra statinio patikrinimo, taip pat žr. Ar yra skirtumas tarp „==“ ir „yra“ „pythone“?

Ką ** (dviguba žvaigždė) ir * (žvaigždė) daro parametrams? - *x pateikia sąrašą, **x suteikia žodyną. Jei nežinote, jūsų programa miršta tuoj pat, kai bandote padaryti kažką netinkamu šiems tipams. „Ką daryti, jei jūsų programa niekada nedaro„ netinkamo “. Tada jūsų programa veikia, sakė jis.

Kaip galiu pateikti „Enum“ Python? - Tai skambutis ribotam domeno tipui. Klasė su klasės lygmens vertėmis atlieka daug darbo. "Ką daryti, jei kas nors pakeičia užduotį." Lengva surinkti. __set__ norite sukurti išimtį. Taip, statinis patikrinimas gali tai pastebėti. Ne, praktiškai neįvyksta, kad kas nors supainiotų su skaičiavimo konstanta ir kintama; ir kai jie tai padarys, tai lengva aptikti vykdymo metu. "Ką daryti, jei logika niekada nebus vykdoma." Na, tai yra blogas dizainas ir blogas testavimas. Kompiliatoriaus klaidų ir neteisingos logikos, kuri niekada nebuvo išbandyta, skleidimas nėra geresnis už tai, kas vyksta dinamiškoje kalboje, kai ji niekada nebuvo išbandyta.

Generatoriaus išraiškos ir sąrašų supratimas - statinis tikrinimas nepadeda išspręsti šios problemos.

Kodėl 1 +++ 2 = 3? - Statinis patikrinimas tai nepastebėtų. 1 +++ 2 C yra visiškai baigtas, nepaisant visų kompiliatorių patikrinimų. Tai ne tas pats Python kaip ir C, bet kaip teisėtas. Ir taip pat paini.

Netikėtai pateiktų sąrašuose pateiktų sąrašų pakeitimų sąrašas - tai visiškai konceptualus. Statinis tikrinimas taip pat neišsprendžia šios problemos. Aiškus ekvivalentas taip pat sudarys ir elgsis blogai.

12
05 марта '09 в 6:36 2009-03-05 06:36 atsakymą pateikė S.Lott kovo 05 '09, 6:36 2009-03-05 06:36

Na, aš nesu Python programuotojas, bet norėčiau pasakyti, kad atsakymas yra „TAIP“.

Bet kokia dinamiška kalba, leidžianti bet kuriuo metu sukurti kintamąjį, gali naudoti „griežtą“ pragmą.

Griežti atributai (vienas iš griežtų „Perl“ variantų, „naudoti griežtą“ apima visus juos vienu metu), Perl reikalauja, kad visi kintamieji būtų paskelbti prieš juos naudojant. Tai reiškia, kad šis kodas:

 my $strict_is_good = 'foo'; $strict_iS_good .= 'COMPILE TIME FATAL ERROR'; 

Sukurti mirtiną klaidą kompiliavimo metu.

Nežinau, kaip „Python“ atmesti šį kodą kompiliavimo metu:

 strict_is_good = 'foo'; strict_iS_good += 'RUN TIME FATAL ERROR'; 

Jūs gausite runtime išimtis, kad strict_iS_good yra neapibrėžtas. Bet tik vykdant kodą. Jei jūsų testo rinkinyje nėra 100% aprėpties, galite lengvai pateikti šią klaidą.

Kiekvieną kartą dirbau ta kalba, kuri neturi tokio elgesio (pavyzdžiui, PHP), aš nervinuosi. Aš nesu puikus mašinistas. Paprastas, bet sunkiai matomas klaidos gali sukelti kodo sugedimą, kurį gali būti sunku stebėti.

Taigi, norėdami pakartoti, TAIP, „ Python“ gali naudoti „griežtą“ pragmą, kad būtų galima patikrinti kompiliavimo laiką, kurį galima patikrinti kompiliavimo metu. Aš negaliu sugalvoti jokių kitų patikrinimų, tačiau geriausias Python programuotojas tikriausiai būtų manęs apie kai kuriuos.

Pastaba Aš sutelkiu dėmesį į pragmatišką „Perl“ varpų variacijos poveikį ir kai kurių detalių blizgesį. Jei tikrai norite sužinoti visas detales, žr.

Atnaujinimas: atsakymai į kai kurias pastabas

Jason Baker: Statiniai tikrintuvai, pvz., Stulpai, yra naudingi. Tačiau jie yra papildomas žingsnis, kuris gali būti ir dažnai ignoruojamas. Kai kurių pagrindinių kompiliatorių patikrinimų kūrimas užtikrina, kad šie patikrinimai būtų atliekami nuosekliai. Jei šiuos patikrinimus kontroliuoja pragma, netgi prieštaravimas, susijęs su patikrinimų išlaidomis, tampa prieštaringas.

border=0

popcnt: aš žinau, kad pythonas išmeta išimties išimtis. Aš pasakiau tą patį. Jei įmanoma, rekomenduoju patikrinti kompiliavimo laiką. Prašome perskaityti pranešimą.

mpeters: kompiuterių kodų analizė negali rasti visų klaidų - ji išsprendžia sustabdymo problemą. Dar blogiau, jei norite rasti klaidų užduotyse, kompiliatorius turi žinoti savo ketinimus ir rasti vietas, kuriose jūsų ketinimai skiriasi nuo jūsų kodo. Tai akivaizdžiai neįmanoma.

Tačiau tai nereiškia, kad patikrinimas neturėtų būti atliekamas. Jei yra problemų, kurias lengva aptikti, klasių, tuomet yra prasminga juos gaudyti.

Aš nesu pakankamai susipažinęs su „pylint“ ir „pirchecker“, kad pasakyti, kokias klaidų klases jie sugauna. Kaip sakiau, esu labai nepatyręs su pythonu.

Šios statinės analizės programos yra naudingos. Vis dėlto manau, kad jei jie nesikartoja kompiliatoriaus galimybių, kompiliatorius visada galės „daugiau sužinoti“ apie programą nei bet kuris statinis patikrinimas. Atrodo, kad nepanaudoti, jei įmanoma, nenaudoti klaidų.

2 naujinimas:

cdleary Teoriškai sutinku su jumis, statinis analizatorius gali atlikti bet kurį testą, kurį kompiliatorius gali naudoti. Python atveju tai turėtų pakakti.

Tačiau, jei kompiliatorius yra gana sudėtingas (ypač jei turite daug pragmų, kurios keičia kompiliavimo metodą, arba, pavyzdžiui, Perl, galite paleisti kodą kompiliavimo metu), tada statinis analizatorius turėtų kreiptis į kompiliatoriaus / vertėjo sudėtingumą analizei.

Heh, visa tai apie sudėtingus kompiliatorius ir veikiantį kodą kompiliavimo metu rodo mano fone Perl.

Suprantu, kad Python neturi pragmų ir negali sudaryti savavališko kodo kompiliavimo metu. Taigi, jei neklystu arba šios funkcijos nėra pridėtos, pakanka paprasto analizatoriaus statiniame analizatoriuje. Žinoma, būtų naudinga užtikrinti, kad šie patikrinimai būtų atliekami kiekvieną kartą. Žinoma, tai, kaip aš tai darau, yra pragma.

Kai tik pridedate pragmių mišiniui, pradėsite slidus šlaitas, o analizatoriaus analizatoriaus sudėtingumas turėtų padidėti proporcingai galiai ir lankstumui, kurį jūs suteikiate savo pragmose. Jei nesate atsargūs, galite baigtis kaip „Perl“, o tada „tik pythonas gali perskaityti Pythoną“, - ateities, kurią nenorėčiau matyti.

Galbūt komandų eilutės jungiklis būtų geresnis būdas priverstinei statinei analizei pridėti;)

(jokiu būdu nesiekia ginčyti „Python“ gebėjimų, kai sakau, kad jis negali dirbti su kompiliavimo laiku kaip „Perl“. Turiu šurmulį, kad tai yra kruopščiai apgalvotas dizaino sprendimas, ir aš matau, kad Perl neįtikėtinas lankstumo laikas yra išmintingas IMHO, didžioji stiprybė ir baisus kalbos silpnumas, taip pat matau šio požiūrio išmintį.)

33
05 марта '09 в 18:37 2009-03-05 18:37 atsakymas pateikiamas daotoad kovo 05 '09, 18:37 2009-03-05 18:37

„Python“ turi kažką, kas gali pakeisti scenarijaus sintaksę:

 from __future__ import print_function 

ir įvairias kitas ateities savybes, turinčias sintaktinių pasekmių. Tai tiesiog, kad Python sintaksė buvo griežtesnė, stabilesnė ir aiškesnė už istorinį Perl; tokie dalykai, kad „Python“ niekada nebuvo „griežtų refs“ ir „griežtų draudimų apribojimų“.

„griežti vars pirmiausia skirti sustabdyti įvestas nuorodas ir trūksta„ mys “nuo atsitiktinių pasaulinių kintamųjų kūrimo (gerai, paketo kintamieji Perl terminais). Tai negali atsitikti „Python“, nes pagal nutylėjimą vietiniai priskyrimai priskiriami priskirtiems skelbimams pagal numatytuosius nustatymus, o nepriskirti balso ženklai lemia išimtį.

(Vis dar yra atvejų, kai naudotojai atsitiktinai bando rašyti per pasaulį, nepranešdami, kad tai yra „pasaulinė išraiška“, todėl atsiranda atsitiktinis vietinis arba dažniau neapribotasLocalError. Tai paprastai, bet tai prieštaringas atvejis, kai turėjote pasakyti kad jūsų vietiniai žmonės gali padėti. Nors keletas patyrusių „Python“ programuotojų sutiktų su skaitymu.)

Kiti kalbos ir bibliotekos pakeitimai, nesusiję su sintaksė, tvarkomi įspėjimais .

11
05 марта '09 в 5:54 2009-03-05 05:54 atsakymą pateikė „ bobince “ kovo 05'09 val. 5:54 2009-03-05 05:54

Manau, kad yra šiek tiek painiavos, pavyzdžiui, tai, kad „naudojasi griežtai“, iš mano pateiktų pastabų. Į jį neįeina kompiliavimo laiko patikrinimai (pvz., „Java“). Šia prasme Perl programuotojai sutinka su Python programuotojais. Kaip sako S. Lott, šie patikrinimų tipai neapsaugo nuo loginių klaidų, nesumažina vienetinių testų, kuriuos reikia rašyti, skaičius, ir mes taip pat nesame dideli vergijų programavimo gerbėjai.

Čia pateikiamas sąrašas, kuriame vartojama „naudoti griežtą“:

  • Simbolinių nuorodų naudojimas yra vykdymo klaida. Jis neleidžia jums daryti beprotiškų (bet kartais tokių naudingų dalykų)

    $var = 'foo';

    $foo = 'bar';

    print $$var; # this would contain the contents of $foo unless run under strict

  • Nedeklaruotų kintamųjų naudojimas yra vykdymo klaida (tai reiškia, kad prieš naudodami jį reikia naudoti kintamąjį „mano“, „mūsų“ arba „vietinį“, kad deklaruotume kintamąjį.

  • Visi paprasti žodžiai laikomi sintaksės klaidų sudarymu. Bradai - tai žodžiai, kurie nebuvo deklaruoti kaip simboliai ar paprogramės. Tai visų pirma norima uždrausti tai, kas istoriškai buvo padaryta, bet yra laikoma klaida.

7
05 марта '09 в 15:27 2009-03-05 15:27 Atsakymą pateikia mpeters kovo 05 '09, 15:27 2009-03-05 15:27

Python neturi tikrosios leksinės srities, todėl griežti skirtumai nebus labai pagrįsti. Jis neturi AFAIK simbolinių nuorodų, todėl jam nereikia tvirtų ryšių. Jis neturi vieno žodžio, todėl jam nereikia griežtų karų.

Sąžiningai, tai tik leksinė sritis, kurią praleidau. Kitose dviejose vietose aš galvoju apie Perl karpas.

5
05 марта '09 в 15:25 2009-03-05 15:25 atsakymas, kurį pateikė Leon Timmermans, kovo 05'09, 15:25 2009-03-05 15:25

Šis originalus atsakymas yra teisingas, tačiau situacija negali būti paaiškinta praktiškai.

„Python“ egzistuoja statiniai analizės įrankiai, tačiau kompiliavimo laiko patikrinimai yra> diametriškai priešingi „Python“ apimančiai prijungimo prie laiko trukmei.

„Perl“ naudoja „griežtą naudojimą“ - galimybę užtikrinti, kad kompiliavimo metu būtų neteisingai parašytas ar kintamasis (paprastai). Tai pagerina patikimumo kodą ir pagreitina plėtrą. Bet norint padaryti tokį dalyką verta, reikia deklaruoti kintamuosius. Python stilius tai trukdo.

Taigi, „Python“, jūs niekada nežinote apie kintamąjį su neteisingu nustatymu, kol nepastebėsite, kad užduotis, kuri, jūsų manymu, nebuvo atlikta, arba kad išraiška atrodo neleistina. Tokių klaidų užfiksavimas gali būti ypač didelis, nes programos tampa didelės ir dėl to, kad žmonės yra priversti išlaikyti kitų sukurtą kodą.

„Java“ ir „C / C ++“ tai daro dar labiau, su tipo patikra. Motyvacija yra praktiška, o ne filosofinė. Kaip galite sugauti kuo daugiau klaidų ir įsitikinti, kad prieš juos atleisdami gamybą, juos pašalinsite? Atrodo, kad kiekviena kalba priima konkrečią strategiją ir dirba su juo, remdamasi tuo, kas, jų manymu, yra svarbi. Perl, kur runtime privalomas nepalaikomas, tikslinga naudoti "naudoti griežtą", kad supaprastintumėte plėtrą.

4
10 нояб. Rob Prentice atsakymas lapkričio 10 d 2010-11-10 03:28 '10, 03:28 2010-11-10 03:28

Manau, kad Perlo 'use strict' panašiau panašus į pragmą, kuriam pasakėte: jis keičia kompiliatoriaus elgesį.

Perlo filosofija skiriasi nuo pythono. Kaip ir jūs, Perl'e jums suteikiama daugiau nei pakankamai lynų, kad galėtumėte pakabinti save.

Larry siena yra didelė kalbotyroje, todėl turime Perl, kuris vadinamas TIMTOWTDI principu (sakykime tim-toe-dee ) prieš Zen python:

Turėtų būti vienas, o galbūt tik vienas, paprastas būdas tai padaryti.

Jūs galite lengvai naudoti „pylint“ ir „PyChecker“, kad pasiektumėte savo use strict „python“ skonį (arba kažką panašaus į perl -cw *scriptname* ), bet dėl ​​skirtingų filosofijų, susijusių su kalbos dizainu, jūs to nepasieksite plačiai paplitusioje praktikoje.

Remdamiesi pirmuoju plakatu pateiktais komentarais, esate susipažinę su „python“ import this . Yra daug dalykų, kurie parodo, kodėl nematote „Python“ use strict lygiavertės. Jei manote apie kožaną, rastą „Zen Python“, galite rasti sau apšvietimą. :)

3
05 марта '09 в 5:57 2009-03-05 05:57 atsakymas pateikiamas popcnt kovo 05 '09, 5:57 2009-03-05 05:57

Labai sunku rašyti dideles programas, nenaudojant „griežtų“ Perl. Jei nenaudosite griežtų sąlygų, jei naudosite šį kintamąjį ir nepastebėsite, palikdami laišką, programa vis dar veikia. Be bandymų pavyzdžių, kad patikrintumėte rezultatus, niekada negalėsite rasti tokių klaidų. Dėl šios priežasties gali prireikti daug laiko, kad išsiaiškintumėte, kodėl gaunate neteisingus rezultatus.

Kai kurios mano „Perl“ programos susideda iš 5000 eilučių iki 10 000 eilutės kodų, suskirstytų į dešimtis modulių. Jūs negalite atlikti gamybos programavimo be griežto naudojimo. Niekada negalėčiau įdiegti gamybos kodo gamykloje su kalbomis, kurios nenaudoja „kintamų deklaracijų“.

Štai kodėl Perl 5.12.x dabar naudoja „naudoti griežtą“ kaip numatytąjį elgesį. Galite juos išjungti.

PHP davė daug problemų dėl nepakankamo kintamųjų vykdymo. Todėl turite apsiriboti mažomis programomis šioje kalboje.

Tik nuomonė ...

abcParsing

1
ответ дан sammy 19 июля '11 в 2:44 2011-07-19 02:44