Les bases

Quelques good practices pour utiliser les chaînes en Python, ou comment bien utiliser print :

print permet d'afficher un peu tout et n'importe quoi :

Une chaîne :

>>> print "coucou"
coucou

L'instance d'un objet :

>>> class Truc:
...     pass
... 
>>> t = Truc()
>>> print t
<__main__.Truc instance at 0x83b8c0>

Une fonction (quid de l'intérêt…)

>>> def mafunc():
...     pass
... 
>>> print mafunc
<function mafunc at 0x821de8>

Maintenant, l'intérêt ce serait plutôt d'utiliser la concaténation, et le “formatage” comme printf le fait.

Le petit opérateur + pour concaténer :

>>> print "gcu " + " is" + " fun"
gcu  is fun
>>> t = "gcu " + " is" + " fun"
>>> t.title()
'Gcu  Is Fun'

Puis le formatage avec % comme printf :

>>> print " %s %d" % ("machaine ", 42)
 machaine  42

On peut aussi filer un dict :

>>> _dict = {'inch' : 'c', 'allah' : '42', 'mollah' : 25}
>>> print "%(inch)s : %(allah)s : %(mollah)d"
%(inch)s : %(allah)s : %(mollah)d
>>> print "%(inch)s : %(allah)s : %(mollah)d" % _dict
c : 42 : 25

Tip: si on veut utiliser des variables locales sans avoir à construire le dict

Ah ouais, vu l'indentation de python, pour créer un truc multiligne, c'est un peu compliqué, mais on peut utiliser les triples quotes :

>>> t = """Ma superbe  
... longue phrase    
... un peu multiligne"""
>>> print t
Ma superbe 
longue phrase 
un peu multiligne

Mais encore ?

Mais regardons plus en détail cet exemple pour voir qu'en fait une chaîne est un objet 'str'

>>> type(t)
<type 'str'>

et que cet objet a deux méthodes 'magiques', __str__ et __repr__

>>> dir(t)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', **'__repr__'**, '__rmod__', '__rmul__', '__setattr__', **'__str__'**, 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

Soit. Ces deux méthodes sont différentes puisque __repr__ est la représentation de l'objet, alors que __str__ est la convi méthode appellée par 'print'

Exemple avec la chaîne triple quotée de tout à l'heure :

>>> t = """Ma superbe  
... longue phrase    
... un peu multiligne"""
>>> t
'Ma superbe \nlongue phrase \nun peu multiligne'
>>> print t
Ma superbe 
longue phrase 
un peu multiligne

Quelques explications : 't' tout seul appelle t.__repr__ alors que print de façon induite __str__

En fait, en principe, __repr__ doit retourner une chaîne de code qui permet de recréer l'objet (ouais, en principe…) alors que __str__ propose quelquechose de plus user-friendly. Donc, quand on code ses propres objets, on peut implémenter les deux méthodes si on veut faire joli. En cas d'absence de __str__ , Python utilise __repr__ . Si __repr__ est absente, Python retourne l'adresse de l'objet en mémoire.

Et si on veut jouer ?

En fait, print n'est qu'un convi-raccourci : derrière, on écrit dans sys.stdout :

>>> print "Matin !#@"
Matin !#@
>>> import sys
>>> sys.stdout.write("Matin !#@\n")
Matin !#@

C'est rigolo, parce qu'en fait on peut rediriger l'écriture vers n'importe quel handler de fichier (pourvu qu'il soit ouvert en écriture, hein) :

>>> toto = open('truc.txt','w')
>>> print 'HAAAARRRHHH'
HAAAARRRHHH
>>> print >> toto, "Haoooonnnnnn"
>>> toto.close()
>>> print open('truc.txt').read()
Haoooonnnnnn

Amusant, non ?

python/string_et_templating.txt · Last modified: 2010/01/12 13:29 (external edit)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0