←Augmentersonvolumedespermepourdessuperéjaculationsfaciales.
ToutcequifaitquePython3estmeilleur
quePython2 Recentlyupdated!
Thisentrywaspostedin Programmation andtagged python python2 python3 on26/01/2017bySam
AvecdenombreusesdistrosLinuxquiviennentavecPython3pardéfautainsiqueDjangoetPyramidquiannoncentbientôtneplus
supporterPython2,ilesttempsdefaireunpoint.
Python3estaujourd’huimajoritairementutilisépourtoutnouveauprojetouformationquej’aipurencontrer.Lesplusimportantes
dépendancesontétéportéesoupossèdentunealternative. Six et Python-future permettentd’écrirefacilementuncodecompatible
aveclesdeuxversionsdanslepiredescas.
Noussommesdoncbienarrivésàdestination.Ilrestequelquesbasesdecodeencorecoincées,lavieestinjuste,maisglobalementonest
enfinauboutdelamigration.Maisçaenamisdutemps!
Ilyadenombreusesraisonsquiontconduitàlalenteurdelamigrationdelacommunauté:
Python2estuntrèsbonlangage.Onneréparepascequimarche.
IlyabeaucoupdecodelegacyenPython2etçacoûtecherdemigrer.
LaPSFaététropgentilleaveclacommunautéetl’achouchoutée.EnJSetRubyilsontdit“migrezouallezvousfairefoutre”ettoutle
mondeamigrétrèsvite.
Maisjepensequelaraisonprincipalec’estlemanquedemotivationpourlefaire.Iln’yapasungrosstickerjaunefluod’untrucgenre
“gagnez30%deperfsenplus”quelesdevsadorentmêmesiçan’influencepastantleurviequeça.Maislescodeursnesontpas
rationnelscontrairementàcequ’ilsdisent.Ilsaimentlesone-liners,c’estpourdire.
Pourtant,ilyadestasdechosesexcellentesenPython3.Simplement:
Ellesnesontpassexy.
Ellesnesevoientpasinstantanément.
Personnen’enparle.
Après2ansdePython3quasi-fulltime,jepeuxvousledire,jeneveuxpluscoderenPython2.Etonvavoirpourquoi.
Unicode,monbelunicode
Onacriéquec’étaitlaraisonprincipale.Amonavisc’estuneerreur.Peudegenspeuventvraimentvoircequeçaimplique.
Maisentantqueformateur,voilàcequejen’aiplusaexpliquer:
Pourquoiunaccentdansuncommentairefaitplanterleprogramme.Et #coding:
Pourquoiilfautfaire fromcodecsimportopen etnonpasjuste open .
Pourquoi request.get().read()+'é' faitplanterleprogramme.Et encode() et decode() .
Pourquoi os.listdir()[0]+'é' faitafficherdestrucschelous.
Pourquoi print(sql_row[0]) faitplanterleprogrammeouaffichedestrucschelous.Oulesdeux.
Etjepeuxsupprimerdechacundemesfichiers:
Tousles uoules 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:
23thoughtson“ToutcequifaitquePython3est
meilleurquePython2”
Leaveacomment
Youremailaddresswillnotbepublished.Requiredfieldsaremarked*
Name*
Email*
Website
Comment
YoumayusetheseHTMLtagsandattributes: <ahref=""title=""><abbrtitle=""><acronymtitle=""><b><blockquotecite="">
<cite><code><pre><deldatetime=""><em><i><qcite=""><strike><strong>
Notifymeoffollow-upcommentsbyemail.
Notifymeofnewpostsbyemail.
DesquestionsPythonsansrapportavecl'article?Posez-lessurIndexError.
Horsdublog
Pagedecontact
@sam_et_maxsurtwitter
NostweetsenRSS
Forkme,I’mfamous(github)
Touslestextesdeceblog,saufsignalementcontraire,sont
souslicencecreativecommon3.0unported.Toiaussi,trouveunarticle
obsolètesurnotreblog
January2017(4)
October2016(2)
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)
Email More
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–python-
version=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?
Maisoùjesuistombé(e)là?
TéléchargercettepageenPDF
Souscrireànosconneries
Entrezvotreadressemailetvous
recevrezunenotificationàchaquenouvel
article.
Join926othersubscribers
TagCloud
0binangularjsasyncioautobahnbashblog
cachecomprehension-listscrossbarcssculdict
djangodonencodinggithttpimport
ipythoniterablejavascriptjquerylinux
metamysqlnginxnsfwpippoo
pythonpython3redisrubyservershell
sshsublimetexttwistedubuntuunicodeunittests
unpackingvirtualenvwampyield
Envoyezdessioux
Onadooooorelesbitcoins:
19zAHPPuce4BAhsdy9KaFwVLurEJXMhMAn
Nosprojets
Multiboards–l’actugeekfrenune
page
›
0bin–lepastebinchiffré›
Allthatcounts–compteurpourjeux›
Djangoquicky–quickviewsfor
Django
›
VizHash.js–Hashvisuels›
Codedesarticlesdublog›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
›
23
Sam&Max Ducode,ducul
Prog AdminSys Philo&culture Cul Cours&tutos Multiboards VeillePythonFr
QuestionsPython