Tout ce qui fait que Python 3 est meilleur que Python 2

publicité
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
Téléchargement