Paramètres imbriqués dans une fonction Python 5


Une fonction très peu connue de Python est la possibilité de définir un paramètre en indiquant qu’il s’agit d’une séquence. Python va automatiquement appliquer l’unpacking dessus :

>>> def message_geolocalise((long, lat), message):
    print '%s' % message
    print 'Longitude : %s' % long
    print 'Latitude : %s' % lat
...     
>>> point = (4.344, 2.44)
>>> message = "glittering prizes"
>>> message_geolocalise(point, message)
glittering prizes
Longitude : 4.344
Latitude : 2.44

Cette fonctionnalité a été retirée en Python 3, jugée rarement utilisée, et surtout facilement remplaçable par un unpacking explicite :

>>> def message_geolocalise(coord, message):
    long, lat = coord
    print '%s' % message
    print 'Longitude : %s' % long
    print 'Latitude : %s' % lat

En effet, en Python on peut utiliser de l’unpacking imbriqué :

a, (b, c) = [1, [2, 3]]

Et cela a été abusé en le mélangeant la syntaxe des paramètres imbriqués, qui rend le truc franchement illisible.

Voilà, c’était le post “vous aviez un poney que vous ne saviez pas et maintenant que vous le savez vous l’avez plus”.

5 thoughts on “Paramètres imbriqués dans une fonction Python

  • Fred

    Ouais bof. Je connaissais la possibilité mais franchement, j’ai rarement vu l’utilité d’écrire def calcul((lon, lat)) par rapport à def calcul(lon, lat). Bref je comprends que ça ait été supprimé…

  • kontre

    @Fred La différence est pas entre def calcul((lon, lat)) et def calcul(lon, lat) mais entre def calcul((lon, lat)) et :

    def calcul(position):
        lon, lat = position

    Et dans ce dernier cas, tu dois te taper la doc (si y’en a une) pour savoir si c’est la latitude ou la longitude d’abord.

    Ce n’est bien sûr pas insurmontable, c’était juste pratique de temps en temps, c’est tout.

    Un autre truc chiant c’est pour les lambdas, comme on a le droit qu’à une expression on ne peut plus faire de l’unpacking et on est obligé d’utiliser les indices.

    Perso, j’avais utilisé cette fonctionnalité une fois dans un de mes codes, ça collait bien pour l’occasion.

Leave a comment

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