Quelques innovation de Python 3 backportées en Python 2.7 4


Comme nous l’avons vu avec les vues ou les collections, Python 2.7 vient avec pas mal de bonus issus directement de la branche 3. En voici quelques autres. Tout ceci n’est bien sûr ni nouveau ni exhaustif, mais je m’aperçois que peu de personnes le savent.

Une notation littérale pour les sets:

>>> {1, 2} == set((1, 2))
True

Une syntaxe pour les dictionnaires en intention:

>>> d = {chr(x): x for x in range(65, 91)}
>>> d
{'A': 65, 'C': 67, 'B': 66, 'E': 69, 'D': 68, 'G': 71, 'F': 70, 'I': 73, 'H': 72, 'K': 75, 'J': 74, 'M': 77, 'L': 76, 'O': 79, 'N': 78, 'Q': 81, 'P': 80, 'S': 83, 'R': 82, 'U': 85, 'T': 84, 'W': 87, 'V': 86, 'Y': 89, 'X': 88, 'Z': 90}

Imbriquer with:

Avant il fallait utiliser nested() ou imbriquer à la main

with open('fichiera') as a:
    with open('fichiera') as b:
        # faire un truc

Maintenant on peut faire:

with open('fichiera') as a, open('fichiera') as b:
    # faire un truc

Rien à voir, mais toujours sympa. timedelta a maintenant une méthode total_seconds() qui retourne la valeur de la durée en seconde. En effet, l’attribut seconds ne retourne que ce qui reste en seconde une fois qu’on a retiré les jours:

>>> from datetime import timedelta
>>> delta = timedelta(days=1, seconds=1)
>>> delta.seconds
1
>>> delta.total_seconds()
86401.0

Notez qu’il n’y a toujours ni attribut minutes, ni heures.

Le module unittest gagne une pléthore d’améliorations, et notamment:

L’utilisation de assertRaises comme context manager:

with self.assertRaises(KeyError):
    {}['foo']

Et un bon gros nombres de méthodes:

assertIsNone() / assertIsNotNone(), assertIs() / assertIsNot(), assertIsInstance() / assertNotIsInstance(), assertGreater() / assertGreaterEqual() / assertLess() / assertLessEqual(), assertRegexpMatches() / assertNotRegexpMatches(), assertRaisesRegexp(),
assertIn() / assertNotIn(), assertDictContainsSubset(), assertAlmostEqual() / assertNotAlmostEqual().

Enfin format() commence à devenir une alternative valable à % car il propose maintenant des marqueurs sans noter d’index:

>>> "{}, puis {} et finalement {}".format(*range(3))
'0, puis 1 et finalement 2'

Et il ajoute le séparateur des milliers au mini-langage de formatage, mais pour la virgule uniquement. Par exemple, si avoir un nombre de 15 caractères minimum formater en tant que float, avec deux chiffres après la virgules, et donc les milliers sont groupés à l’américaine:

>>> '{:15,.2f}'.format(54321)
'      54,321.00'

4 thoughts on “Quelques innovation de Python 3 backportées en Python 2.7

  • r4is3

    trés bon article, merci! je viens de former 16 personne à python et introduire les differences entre la 2.x et la 3 c’est tout à fait bienvenu!

    j’adopte aussi l’expression “imbriquer à la main” comme words of the day! xD

  • Réchèr

    Merci pour ces infos diverses. Par contre, quelqu’un peut m’expliquer l’intérêt d’avoir créé toutes ces fonctions assert ?

    Je me suis jamais servi de ce genre de fonction. Mais j’aurais dit que la seule vraiment utile est assertTrue. Avec celle-là, on peut faire toutes les autres.
    assertTrue(a >= b) au lieu de assertGreaterEqual(a, b)
    Et ainsi de suite.

  • Sam Post author

    L’interêt d’une suite de test n’est pas juste de tester, sinon ou aurait pas unittest, on ferait tout à la main à basse de assert truc == machin.

    La lib est aussi là pour nous faciliter le debuggage.

    Par exemple, si assertGreaterEqual() echoue, il va afficher:

    AssertionError: “x” unexpectedly not greater than or equal to “z”.

    La sortie est très facile à lire:

    – on sait quel type de test à échouer (pas une égalité, pas un assertTrue, mais bien un supérieur ou égal)
    – on sait quelles valeurs ont été testées.

    On peut donc débugger très vite sans avoir à lancer un pdb pour comprendre ce qui a cloché.

Leave a comment

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