Créer une raw string avec un antislash à la fin


Si vous vous souvenez, on ne peut pas mettre un antislash à la fin d’une raw string :

>>> print(r'Moi pouvoir\\')
Moi pouvoir\\
>>> r'Moi pouvoir\\'
'Moi pouvoir\\\\'
>>> r'Moi pouvoir\'
  File "<stdin>", line 1
    r'Moi pouvoir\'
                  ^
SyntaxError: EOL while scanning string literal

La plupart du temps on s’en branle.

Mais supposons que vous vouliez créer un path pour disons, pauvre de vous, une commande DOS…

>>> print("\chemin\vers\dossier\dos\\")
\chemin
        ers\dossier\dos\
>>> print(r"\chemin\vers\dossier\dos\\")
\chemin\vers\dossier\dos\\

Ah, ah, te voilà bien baisé, cher programmeur !

Sauf que non, car une raw string n’est pas un type de string particulier, comme on l’a vu ici, donc on peut faire ça :

>>> print(r"\chemin\vers\dossier\dos" + "\\")
\chemin\vers\dossier\dos\

Zooooo !

Et même si on se sent chaud, on peut utiliser la concaténation implicite pour se la jouer mega chaud du slip :

>>> print(r"\chemin\vers\dossier\dos" "\\")
\chemin\vers\dossier\dos\

Qu’il en faut peu pour qu’un dev se sente le roi du monde…

9 thoughts on “Créer une raw string avec un antislash à la fin

  • mothsART

    l’implicite, c’est le mal… c’est marqué dans la PEP verset 20!
    Mais bon, des fois ça évite d’en écrire des tonnes pour finalement pas grand chose…

    Se sentir le roi du monde avec un path DOS, chacun sa came ^^.

  • kontre

    Non, je ne me souviens pas. Je devrais ?

    En l’occurrence la concaténation implicite est plutôt explicite, je trouve. D’ailleurs point de vue perf, c’est mieux que le + qui sera fait à l’exécution, la concaténation implicite sera faite au parsing. Oui, oui, ça n’a aucun effet visible, mais chacun se sent le roi du monde comme il peut. (En même temps je ne suis pas totalement certain de ne pas avoir dit une connerie. M’en fous, je suis le roi, je fais ce que je veux !)

  • Recher

    C’est bon à savoir.
    Par contre, si c’est juste pour gérer des chemins Windows, on s’en fout un peu. Ce superbe OS accepte également comme séparateur de répertoire, les suites d’antislash de longueur arbitraire.

    Testé dans une console DOS, et ça marche :
    C:\>dir Windows\\\\\\\\\\system\\\\\

    Testé dans une console python, sous Windows :

    import os
    os.stat(r"c:windowssystem")
    &gt;&gt;&gt; nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=4096L, st_atime=1316349809L, st_mtime=1316349809L, st_ctime=1247539027L)
    os.stat(r"c:windowssystem")
    &gt;&gt;&gt; nt.stat_result(st_mode=16895, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=4096L, st_atime=1316349809L, st_mtime=1316349809L, st_ctime=1247539027L)
  • Amnesy

    A mon avis le plus simple reste quand même encore de se passer de raw string

    &gt;&gt; print('cheminversdossierdos')
    cheminversdossierdos
  • JB

    Windows accepte autant les slashs que les antislashs pour ses chemins. ;)

  • Sam Post author

    Oui mais os.path.join ne rajoute pas de slash si il est absent à la fin.

  • kontre

    J’ai dit une bêtise, le + entre deux chaînes statiques est déjà optimisé par CPython, donc pas de différence de performance (on négligera les deux caractères de plus à parser ^^). cf. le lien de Sdud;

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.