Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Petite remarque sur les docstrings

3 réponses
Avatar
Do Re Mi chel La Si Do
Bonsoir !

Parce que je me suis fait avoir, je vous communique l'info.

Voilà un exemple de docstring :

def traitedir():
"""Cette fonction compare le répertoire de C:\fax avec D:\fax, et
\\Serveur\fax """


Hé bien, ne faites pas ça ! Il faut utiliser, systématiquement :

def traitedir():
r"""Cette fonction compare le répertoire de C:\fax avec D:\fax, et
\\Serveur\fax """


Hé oui, il faut mettre les docstrings en "raw strings". Pourquoi, me
direz-vous ? Parce que, cher monsieur (ou madame), essayez de lire ces
docstrings, avec le module inspect ; exemple : print
inspect.getdoc(traitedir)


Et ceci est aussi valable pour les commentaires (inspect.getcomments(xx))


N'oubliez pas : avec de petits 'rrrrrrrrrrrrrrrrrrrr', vos inspections de
scripts ronronneront...



@-salutations

Michel Claveau

3 réponses

Avatar
Christophe Cavalaria
Do Re Mi chel La Si Do wrote:

Bonsoir !

Parce que je me suis fait avoir, je vous communique l'info.

Voilà un exemple de docstring :

def traitedir():
"""Cette fonction compare le répertoire de C:fax avec D:fax, et
Serveurfax """


Hé bien, ne faites pas ça ! Il faut utiliser, systématiquement :

def traitedir():
r"""Cette fonction compare le répertoire de C:fax avec D:fax,
et
Serveurfax """


Hé oui, il faut mettre les docstrings en "raw strings". Pourquoi, me
direz-vous ? Parce que, cher monsieur (ou madame), essayez de lire ces
docstrings, avec le module inspect ; exemple : print
inspect.getdoc(traitedir)


Attention, mettre un r devant les strings ne s'appelle par "raw strings"
mais bien "regexp strings". En effet, il ne faut pas croire que ce mode
permet la non interpretation absolue des . Essayez de mettre un nombre
impair d'antislash comme derniers caractères de votre chaine pour voir de
quoi je parle.

Si j'ai bien compris, dans les regexp il n'est pas authorisé de terminer une
chaine avec un nombre impair d'antislash ce qui fait que cette limitation
ne pose pas de problèmes dans ce cas.

Il est très probable que Python 3000 cesse completement l'interpretation des
antislash mais la sortie de celui-ci est encore très incertaine ;)

Avatar
Eric Brunel
On Tue, 14 Jun 2005 00:56:37 +0200, Christophe Cavalaria wrote:
[snip]
Attention, mettre un r devant les strings ne s'appelle par "raw strings"
mais bien "regexp strings".


Désolé mais non; cf. http://docs.python.org/ref/strings.html
"""
String literals may optionally be prefixed with a letter "r" or "R"; such strings are called
raw strings and use different rules for interpreting backslash escape sequences.
^^^^^^^^^^^
"""

En effet, il ne faut pas croire que ce mode
permet la non interpretation absolue des . Essayez de mettre un nombre
impair d'antislash comme derniers caractères de votre chaine pour voir de
quoi je parle.

Si j'ai bien compris, dans les regexp il n'est pas authorisé de terminer une
chaine avec un nombre impair d'antislash ce qui fait que cette limitation
ne pose pas de problèmes dans ce cas.


Ca n'a rien à voir avec les expressions régulières; si je me souviens bien, c'est un stupide problème de parsing qui fait qu'un ' dans une chaine est quand meme interprété comme une quote "échappée", meme quand on est dans une raw string. Donc, si on écrit r'', c'est en fait la quote commençant la chaine, une quote "échappée" qui sera interprétée *plus tard* comme un backslash + une quote et il manque la quote de fin => SyntaxError

Il est très probable que Python 3000 cesse completement l'interpretation des
antislash mais la sortie de celui-ci est encore très incertaine ;)


Tu as des sources pour ça? Parce que j'aimerais bien savoir comment on pourra écrire 'Je m'appelle "toto"' (ou "Je m'appelle "toto"" si tu préfères) si on n'a plus de moyen d'"échapper" les quotes ou les double-quotes. Mettre des ''' ou des """ à chaque fois me semble un peu lourdingue...
--
python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"

Avatar
Christophe Cavalaria
Eric Brunel wrote:

On Tue, 14 Jun 2005 00:56:37 +0200, Christophe Cavalaria
wrote:
[snip]
Attention, mettre un r devant les strings ne s'appelle par "raw strings"
mais bien "regexp strings".


Désolé mais non; cf. http://docs.python.org/ref/strings.html
"""
String literals may optionally be prefixed with a letter "r" or "R"; such
strings are called raw strings and use different rules for interpreting
backslash escape sequences. ^^^^^^^^^^^
"""


Oups, voila ce que c'es de poster à des heures indues !

En effet, il ne faut pas croire que ce mode
permet la non interpretation absolue des . Essayez de mettre un nombre
impair d'antislash comme derniers caractères de votre chaine pour voir de
quoi je parle.

Si j'ai bien compris, dans les regexp il n'est pas authorisé de terminer
une chaine avec un nombre impair d'antislash ce qui fait que cette
limitation ne pose pas de problèmes dans ce cas.


Ca n'a rien à voir avec les expressions régulières; si je me souviens
bien, c'est un stupide problème de parsing qui fait qu'un ' dans une
chaine est quand meme interprété comme une quote "échappée", meme quand on
est dans une raw string. Donc, si on écrit r'', c'est en fait la quote
commençant la chaine, une quote "échappée" qui sera interprétée *plus
tard* comme un backslash + une quote et il manque la quote de fin =>
SyntaxError


Oui c'est un stupide problème de parsing mais la raison pour laquelle ils
ont laissé cela en l'état est justement parceque ça ne pose pas de
problèmes pour les regexp. Sinon, une telle limitation aurait probablement
été jugée redibitoire.

De toute façon, il ne faut jamais coder en dur des séparateurs de répertoire
mais passer par os.path.join plustot :)

Il est très probable que Python 3000 cesse completement l'interpretation
des antislash mais la sortie de celui-ci est encore très incertaine ;)


Tu as des sources pour ça? Parce que j'aimerais bien savoir comment on
pourra écrire 'Je m'appelle "toto"' (ou "Je m'appelle "toto"" si tu
préfères) si on n'a plus de moyen d'"échapper" les quotes ou les
double-quotes. Mettre des ''' ou des """ à chaque fois me semble un peu
lourdingue...


Comme dans Pascal et dans SQL ( le vrai, pas cette chose horrible appelée
MySql ). On double le séparateur quand on veut en mettre un : exemple :
'Je m''appelle "toto"'
Simple quote : "'" ou '''

Ou alors simplement comme je fesais en Basic sur Amstrad : 'Je m" +
chr( codedusimplequote ) + "appelle "toto"' ;) Mais je pense plustot pour
la solution precedente.