• # Autres syntaxes

    Posté par (site web personnel) . En réponse au journal Python et valeurs par défaut des paramètres. Évalué à 7.

    Au cours de mes pérégrination pythranesques, j'ai découvert une fleur du langage python, que je m'empresse de partager.

    Ce n'est pas vraiment une "fonctionnalitée" cachée. Il y a d'autres manières d'avoir des variables locales pour une fonction.

    Exemple avec une fermeture (closure) :

    >>> def with_locals():
    ... accu = []
    ... def func():
    ... accu.append(1)
    ... print(accu)
    ... return func
    ... 
    >>> func = with_locals()
    >>> func()
    [1]
    >>> func()
    [1, 1]
    >>> func()
    [1, 1, 1]
    >>> func()
    [1, 1, 1, 1]
    
    

    À partir de Python 3, on peut également modifier la variable (et non pas juste son contenu) grâce à nonlocal :

    >>> def with_locals():
    ... x = 0
    ... def func():
    ... nonlocal x
    ... x += 1
    ... print(x)
    ... return func
    ... 
    >>> func = with_locals()
    >>> func()
    1
    >>> func()
    2
    >>> func()
    3
    
    

    On peut également utiliser des attributs arbitraires à la fonction pour y stocker des trucs :

    >>> def hello():
    ... print(hello.world)
    ... 
    >>> hello.world="Hello World!"
    >>> hello()
    Hello World!
    >>> hello.world="Bonjour Monde !"
    >>> hello()
    Bonjour Monde !
    
    

    (La fonction peut également modifier hello.world)