Sam&Max Ducode,ducul Prog AdminSys Philo&culture Cul Cours&tutos Multiboards VeillePythonFr QuestionsPython Maisoùjesuistombé(e)là? ToutcequifaitquePython3estmeilleur quePython2 TéléchargercettepageenPDF 23 Recentlyupdated! Thisentrywaspostedin Programmation andtagged python python2 python3 on26/01/2017bySam Souscrireànosconneries Entrezvotreadressemailetvous recevrezunenotificationàchaquenouvel article. AvecdenombreusesdistrosLinuxquiviennentavecPython3pardéfautainsiqueDjangoetPyramidquiannoncentbientôtneplus supporterPython2,ilesttempsdefaireunpoint. Python3estaujourd’huimajoritairementutilisépourtoutnouveauprojetouformationquej’aipurencontrer.Lesplusimportantes dépendancesontétéportéesoupossèdentunealternative. Six et Python-future permettentd’écrirefacilementuncodecompatible Join926othersubscribers aveclesdeuxversionsdanslepiredescas. EmailAddress Noussommesdoncbienarrivésàdestination.Ilrestequelquesbasesdecodeencorecoincées,lavieestinjuste,maisglobalementonest enfinauboutdelamigration.Maisçaenamisdutemps! J'adhère,bondieu! Ilyadenombreusesraisonsquiontconduitàlalenteurdelamigrationdelacommunauté: Python2estuntrèsbonlangage.Onneréparepascequimarche. IlyabeaucoupdecodelegacyenPython2etçacoûtecherdemigrer. LaPSFaététropgentilleaveclacommunautéetl’achouchoutée.EnJSetRubyilsontdit“migrezouallezvousfairefoutre”ettoutle mondeamigrétrèsvite. TagCloud 0binangularjsasyncioautobahnbashblog cachecomprehension-listscrossbarcssculdict djangodonencodinggithttpimport Maisjepensequelaraisonprincipalec’estlemanquedemotivationpourlefaire.Iln’yapasungrosstickerjaunefluod’untrucgenre “gagnez30%deperfsenplus”quelesdevsadorentmêmesiçan’influencepastantleurviequeça.Maislescodeursnesontpas rationnelscontrairementàcequ’ilsdisent.Ilsaimentlesone-liners,c’estpourdire. ipythoniterablejavascriptjquerylinux Pourtant,ilyadestasdechosesexcellentesenPython3.Simplement: sshsublimetexttwistedubuntuunicodeunittests metamysqlnginxnsfwpippoo pythonpython3redis rubyservershell unpackingvirtualenvwampyield Ellesnesontpassexy. Ellesnesevoientpasinstantanément. Personnen’enparle. Envoyezdessioux Onadooooorelesbitcoins: Après2ansdePython3quasi-fulltime,jepeuxvousledire,jeneveuxpluscoderenPython2.Etonvavoirpourquoi. 19zAHPPuce4BAhsdy9KaFwVLurEJXMhMAn Unicode,monbelunicode Nosprojets Onacriéquec’étaitlaraisonprincipale.Amonavisc’estuneerreur.Peudegenspeuventvraimentvoircequeçaimplique. › Multiboards–l’actugeekfrenune page Maisentantqueformateur,voilàcequejen’aiplusaexpliquer: Pourquoiunaccentdansuncommentairefaitplanterleprogramme.Et #coding: › 0bin–lepastebinchiffré Pourquoiilfautfaire fromcodecsimportopen etnonpasjuste open . › Allthatcounts–compteurpourjeux Pourquoi request.get().read()+'é' faitplanterleprogramme.Et encode() et decode() . › Djangoquicky–quickviewsfor Pourquoi os.listdir()[0]+'é' faitafficherdestrucschelous. Django Pourquoi print(sql_row[0]) faitplanterleprogrammeouaffichedestrucschelous.Oulesdeux. › VizHash.js–Hashvisuels Etjepeuxsupprimerdechacundemesfichiers: › Codedesarticlesdublog Tousles u oules from__future__/codecs Lesen-têted’encoding. Lamoitiédes encode / decode . EttouteslesAPISontunparamètre encoding ,quiapourvaleurpardéfaut‘UTF8′. Debuggageforthewin Descentainesd’ajustementsontétéfaitspourfaciliterlagestiondeserreursetledebuggage.Meilleuresexceptions,plusdevérifications, meilleursmessagesd’erreur,etc. Quelquesexemples… EnPython2: >>>[1,2,3]<"abc" True EnPython3 TypeError:unorderabletypes:list()<str() ofcourse. EnPython2, IOError pourtout: >>>open('/etc/postgresql/9.5/main/pg_hba.conf') Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> IOError:[Errno13]Permissiondenied:'/etc/postgresql/9.5/main/pg_hba.conf' >>>open('/etc/postgresql/9.5/main/') Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> IOError:[Errno21]Isadirectory:'/etc/postgresql/9.5/main/' EnPython3,c'estbienplusfacileàgérerdansun try / except ouàdebugger: >>>open('/etc/postgresql/9.5/main/pg_hba.conf') Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> PermissionError:[Errno13]Permissiondenied:'/etc/postgresql/9.5/main/pg_hba.conf' >>>open('/etc/postgresql/9.5/main/') Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> IsADirectoryError:[Errno21]Isadirectory:'/etc/postgresql/9.5/main/' Lescascadesd'exceptionsenPython3sonttrèsclaires: >>>try: ...open('/')#Erreur,c'estundossier: ...exceptIOError: ...1/0#ouic'eststupide,c'estpourl'exemple ... Traceback(mostrecentcalllast): File"<stdin>",line2,in<module> IsADirectoryError:[Errno21]Isadirectory:'/' Duringhandlingoftheaboveexception,anotherexceptionoccurred: File"<stdin>",line4,in<module> ZeroDivisionError:divisionbyzero LamêmechoseenPython2: Traceback(mostrecentcalllast): File"<stdin>",line4,in<module> ZeroDivisionError:integerdivisionormodulobyzero Bonnechancepourtrouverl'erreuroriginale. Pleindeduplicationsontétéretirées. EnPython2,undevdoitsavoirladifférenceentre: range() et xrange() map/filter et itertools.imap/itertools.ifilter dict.items/keys/values , dict.iteritems/keys/values et dict.viewitems/keys/values open et codecs.open Et md5 vs hashlib.md5 getopt , optparse , argparse Cettemanipulationdefichiersefaitavec sys , os ou shutil ? Onhéritede UserDict ou dict ? UserList ou list ? ... Souspeinedebugsoudetuersesperfs. Certainsbugssontinévitables,etlesmodules csv et re sontparexemplepourtoujoursbuggésenPython2. Goodbyeboilerplate FaireunprogrammecorrectenPython2requièreplusdecode.Prenonsl'exempled'unesuitedefichierquicontientdesvaleursà récupérersurchaqueligne,oudescommentaires(avecpotentiellementdesaccents).Lesfichiersfontquelquescentainesdeméga,etje veuxitérersurleurscontenus. Python2: #coding:utf8 from__future__importunicode_literals,division importos importsys frommathimportlog fromcodecsimportopen fromglobimportglob fromitertoolsimportimap#pournepascharger300Moenmémoired'uncoup FS_ENCODING=sys.getfilesystemencoding() SIZE_SUFFIXES=['bytes','KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'] deffile_size(size): order=int(log(size,2)/10)ifsizeelse0#potentialbugwithlog2 size=size/(1<<(order*10)) return'{:.4g}{}'.format(size,suffixes[order]) defget_data(dir,*patterns,**kwargs): """Chargelesdonnéesdesfichiers""" #keywordonlyargs convert=kwargs.get('convert',int) encoding=kwargs.get('encoding','utf8') forpinpatterns: forpathinglob(os.path.join(dir,p)): ifos.path.isfile(path): upath=path.decode(FS_ENCODING,error="replace") print'Trouvé:',upath,file_size(os.stat(path).st_size) withopen(path,encoding=encoding,error="ignore")asf: #retirerlescommentaires lines=(lforlinfif"#"notinl) forvalueinimap(convert,f): yieldvalue C'estdéjàpasmal.OngèrelescaractèresnonASCIIdanslesfichiersetlenomdesfichiers,onaffichetoutproprementsurleterminal,on itèreenlazypournepassaturerlaRAM...Uncodeassezchouette,etpourobtenircerésultatdansd'autreslangagesvousauriezplus dégueu(ouplusbuggé). Python3: #wow,somuchspace,muchlessimport frommathimportlog2#nonbuggylog2 frompathlibimportPath#plusdeos.pathbullshit SIZE_SUFFIXES=['bytes','KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'] deffile_size(size): order=int(log2(size)/10)ifsizeelse0 size=size/(1<<(order*10)) returnf'{size:.4g}{suffixes[order]}'#fstring defget_data(dir,*patterns,convert=int,encoding="utf8"):#keywordonly """Chargelesdonnéesdesfichiers""" forpinpatterns: forpathinPath(dir).glob(p): ifpath.is_file(): print('Trouvé:',path,file_size(path.stat().st_size)) withopen(path,encoding=encoding,error="ignore")asf: #retirerlescommentaires lines=(lforlinfif"#"notinl) yieldfrommap(convert,lines)#déroulageautomatique Oui,c'esttout. Etcen'estpasjusteunequestiondetailleducode.Noteztoutcequevousn'avezpasàsavoiràl'avancepourqueçamarche.Lecodeest pluslisible.Lasignaturedelafonctionmieuxdocumentée.EtilmarcheramieuxsuruneconsoleWindowscarlesupportaétéamélioréen Python3. Etencorej'aiétésympa,jen'aipasfaitlagestiondeserreursdelecturedesfichiers,sinononenavaitencorepour3ans. Ilyadestasd'autrestrucs. L'unpackinggénéralisé: >>>a,*rest,c=range(10)#récupérerlapremièreetdernièrevaleur >>>foo(*bar1,*bar2)#toutpasserenarg >>>{**dico1,**dico2}#fusionnerdeuxdico:) OulaPOOsimplifiée: classFooFooFoo(object): ... classBarBarBar(FooFooFoo): defwololo(self): returnsuper(BarBarBar,self).wololo() Devient: classFooFooFoo: ... classBarBarBar(FooFooFoo): defwololo(self): returnsuper().wololo() Python3esttoutsimplementplussimple,etplusexpressif. Bonus Evidementilyapleindetrucsquin'intéresserontqu'unecertainecatégoriededevs: ipaddress.ip_address pourparserlesadressesIP. asyncio pourfairedel'IOnonblocantesansthreads. enum desenumdetoutessortes. functools.lru_cache pourcacherlerésultatdesesfonctions. typehintspourvérifierlavaliditédesoncode. l'opérateur @ pourmultiplierdesmatricesavec numpy . concurrent.futures pourfairedespoolsnonblocantespropres. statistics statsperformantesetcorrectes. tracemalloc trouverlesfuitesdemémoire. faulthandler gérerlescrashducodeCproprement. Sivousn'êtespasconcernés,çan'estpasmotivant.Maissiçavoustouchepersonnellement,c'estsupercool. Aupassage,depuisla3.6,Python3estenfinplusrapidequePython2pourlaplupartdesopérations:) Pourfinir... Toutesceschoseslàs'accumulent.Uncodepluscourt,pluslisible,plusfacileàdébugger,plusjuste,plusperformant.Paruntasdepetits détails. Alorsoui,lamigrationnevapasrestaurerinstantanémentvotreérectionetvousfaireperdredupoids.Maissurlelongterme,toutça compteénormément. Partager: Like Tweet Email 2 More 23thoughtson“ToutcequifaitquePython3est meilleurquePython2” desfrenes 26/01/2017at14:19 “DjangoetPyramidquiannoncentbientôtneplussupporterPython3″ c’estpaspython2plutôt? Emmanuel 26/01/2017at14:21 Oooops:autoutdébutdel’article“quiannoncentbientôtneplussupporterPython3″—>c’est2;-) Sam Postauthor 26/01/2017at14:40 gordon 26/01/2017at15:09 Oui,maisPython3c’estpasTuringComplïte©! DavidChanial 26/01/2017at15:10 DjangoannonceneplussupporterPython3?Ou2?;) asshole 26/01/2017at15:11 ToutcequifaitquejesuispassédirectementdePython2àGo: gestiondelaconcurrenceintégréedanslelanguage, distributiondeprogrammesfacile, rapiditédecompilationetd’execution, vérificationdeformatagepardéfaut, gestiondestestspardéfaut, gestiondeladocpardéfaut. J’enpouvaisplusdepasser3heuresàéplucher12docsdifférentesquisecontredisentpourdistribuerun programme… Jen’aimepasl’évolutionquePython3prend… L’asynchronenemeconvaincpasdepuisquej’aigoûtéauxthreadslégersdeGo. Bref,j’utilisetoujoursPythonpourdesscriptsd’adminrapidesàécriremaispluspourdesprojetsentiers… Pourtantilyaavaitl’exempledePerl…Onnecassepasunecommunautésinonc’estlafin…etj’aipasquecela àbranlerderéecriremesprogsd’ilya10ansetd’alleràlapêcheauxmodulesvoirs’ilssontv2ouv3…maisje vousrassure,jetrouvequ’ilyapire:leJavascript;) Sam Postauthor 26/01/2017at15:14 @gordon: Ouic’estunedesraisonspourlesquellesjenerecommandepassonlivre.Sicertainspointssontintéressant,il yabeaucoupdemauvaisefoi.Particulièrement,Python3estimmensémentmeilleurpourlesdébutants.C’est justementundespointsprincipauxd’attraction.Direlecontraireestsoitunmensonge,soitdel’incompétence. @david:ouaij’aibu blackmoor 26/01/2017at15:18 Typos: –“EttouteslesAPISontunparamètresencoding”–>“unparamètre” –“Descentainesd’ajustementsonétéfait”–>“ontété” –“Lesfichiersfontquelquescentainesdeméga,etjeuxveuxitérersurleurscontenus.”–>“etjeveux” –“Etencorej’aiétésympas”–>“sympa” –“lamigrationnevapasréstaurerinstantannémentvotreerectionetvousfaireperdredupoids”–>restaurer instantanémentvotreérection Est-ceunetypo?“EnPythonundevdoitsavoirladifférenceentre:”–>“EnPython2″ HS:Quitteàposterunmessage,ungrandmerciàtoiSampourtoutcesarticlessuperintéressant(merciaussi àMax,maisj’ail’impressiondenepasleliresouvent) Question:jenecodepasvraimentenpythonmêmesij’aiétéamenéàenfaireuntoutpetitpeu.N’est-cepas gênantden’apprendrequepython3quandoncommence?Nedevrait-onpasd’abordgalérerunpeusurle2 histoiredemieuxcomprendre? Sam Postauthor 26/01/2017at15:19 @asshole:amoinsd’écrireunserveur,Gon’aquasimentaucunavantagesurPython.Analyserdesdonnées, manipulerdutexte,fairedesscript,gérerdeserreurs,faireunsiteweb…Pythonesttoujoursplusfacileà utiliserpourcela.Ouiladistributionestmeilleur,maisvuqu’onfaitrarementdesprogrammesavecGUIavecau finalçan’apportepasgrandchose.Quitteàapprendreunlangagebasniveauetsefairechier,autantprendre rust. Sam Postauthor 26/01/2017at15:22 @blackmoor:merci.Nonplusmaintenant,tupeuxoublierPython2.Caneservirapasassez.Siunjourpar malchancetudoislireouporterunecodePython2,ilseratempsdet’ypencher,maisseulementàcemoment là.CeciditjustelireuncodePython2estfacilesionconnaitPython3.Lelangagen’estpasfondamentalement différent. Splint' 26/01/2017at16:23 Cafaitplaisircesnouveauxposts! JepartageclairementtonpointdevuesurPython3,surtoutdepuisl’arrivee3.5 Typosrepereesdanslafonction get_data del’exemplePython3 *uneparenthèseentropaprèsle glob(p) * ifpath.isfile(): => ifpath.is_file(): * path.stat.st_size => path.stat().st_size Sam Postauthor 26/01/2017at16:30 Merci Zesk06 26/01/2017at17:13 Maismoi,jebossesousCentOS6.5,etsousCentOS6.5c’estencorepython2.6pardéfaut…oui2.6 Onpeuts’ensortireninstallantlessoftwarecollectionsmaisducoupilfautenvoyer46commandesavantde pouvoirtaperdupython3. brefc’estpasgagné beeftanen 26/01/2017at17:18 Nousonveutune2.8;) entwanne 26/01/2017at17:37 ResteàcequelesdistributionsLinuxàlatraînefinissentparaccepterqu’aujourd’hui,python==python3… beeftanen 26/01/2017at17:53 https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65#.dpvwxez40 cocksucker 26/01/2017at17:54 @Sam Avoue,tuvoulaisjustevérifierqu’onavaitbientousmigréversPython3?;),uneformed’auditinformelen modeshadow;) Sam Postauthor 26/01/2017at17:57 @Zesk06:ouaicommejeledisais,lemonteestinjuste. Mespalliatifssont: Pythonz(4commandespourinstallerPython2.6https://github.com/saghul/pythonz). nuikta.J’aiPython2.6+headers+nuiktasurmamachineetjefaisnuitka–standalone–pythonversion=2.6mon_script.pyetçamesortunmon_script.dist/mon_script.exestandalonequimarchesur touslesvieuxserveurssansrieninstaller.Maisledossierfait20Mopourunhelloworld:) Abject 26/01/2017at18:47 Heysuper!!!DenoveauxarticlessurSam&Maxveneztous!!!!!!!!!!!!!! Enfinunpointexhaustif(oupresque)desdifférences(oserais-jediredesavantages)depython3parrapportà Python2… BenmoijedoisfairedescodePython3surCentOS7maisj’aipaslapossibilitéd’avoirtoutesleslibdispos pourPython3…–>onfaitdubackportdeslibPython3versPython2pourqu’aufinalonpuissefairedu Python3… Vivement2020etlafinofficielledePython2!!!! fero14041 26/01/2017at19:16 Pu*ainlecon(c’estmoi),j’avaisdéfacél’articleavecunebalise“code”malfermée…Mesplusplatesexcusesà tousleslecteursdepassage! boblinux 26/01/2017at21:02 Mercipourl’article,sympa! Réchèr 27/01/2017at20:11 Yep! Sansoublierlesimportsrelatifsetabsolus,quiclarifientbienleschoses,etlefameux“1/2=0″quiadu dérouterbonnombredenéophytes. Sivousêtesunhomme,coderenpython3multipliepar1.5laquantitédespermelorsd’uneéjaculation. Sivousêtesunefemme,ladensitédecorpusculedeKrausesurleclitorisestmultipliéepar1.5également. Vivementlepython4! Buffalo974 28/01/2017at20:31 UnarticlesurNuitkadeprevu? Leaveacomment Youremailaddresswillnotbepublished.Requiredfieldsaremarked* Name* Email* Website Comment YoumayusetheseHTMLtagsandattributes: <ahref=""title=""><abbrtitle=""><acronymtitle=""><b><blockquotecite=""> <cite><code><pre><deldatetime=""><em><i><qcite=""><strike><strong> PostComment Notifymeoffollow-upcommentsbyemail. Notifymeofnewpostsbyemail. DesquestionsPythonsansrapportavecl'article?Posez-lessurIndexError. ←Augmentersonvolumedespermepourdessuperéjaculationsfaciales. Horsdublog Touslestextesdeceblog,saufsignalementcontraire,sont souslicencecreativecommon3.0unported. Toiaussi,trouveunarticle obsolètesurnotreblog › Pagedecontact › @sam_et_maxsurtwitter › January2017(4) › NostweetsenRSS › October2016(2) › Forkme,I’mfamous(github) › September2016(5) › August2016(2) › March2016(8) › February2016(9) › January2016(16) › December2015(6) › November2015(7) › October2015(2) › September2015(6) › August2015(10) › July2015(18) › June2015(13) › May2015(12) › April2015(13) › March2015(8) › February2015(4) › January2015(21) › December2014(24) › November2014(6) › October2014(18) › September2014(10) › August2014(5) › July2014(11) › June2014(25) › May2014(14) › April2014(10) › March2014(23) › February2014(27) › January2014(17) › December2013(27) › November2013(25) › October2013(27) › September2013(1) › August2013(31) › July2013(32) › June2013(24) › May2013(30) › April2013(31) › March2013(33) › February2013(29) › January2013(34) › December2012(32) › November2012(36) › October2012(35) › September2012(36) › August2012(37) › July2012(33) › June2012(24) › May2012(31) › April2012(20) ·©2017Sam&Max·DesignedbyThemes&Co· › March2012(10) › February2012(14) Backtotop