68 votes

Meilleure pratique pour définir la valeur par défaut d'un paramètre censé être une liste en Python ?

J'ai une fonction Python qui prend une liste en paramètre. Si je définis la valeur par défaut du paramètre sur une liste vide comme celle-ci :

 def func(items=[]):
    print items

Pylint me dirait "Valeur par défaut dangereuse [] comme argument". Alors je me demandais quelle est la meilleure pratique ici?

98voto

Sven Marnach Points 133943

Utilisez None comme valeur par défaut :

 def func(items=None):
    if items is None:
        items = []
    print items

Le problème avec un argument par défaut modifiable est qu'il sera partagé entre toutes les invocations de la fonction - voir "l'avertissement important" dans la section correspondante du didacticiel Python .

1voto

Odomontois Points 3371

En complément et aussi pour mieux comprendre ce qu'est python, voici mon petit extrait thématique :

 from functools import wraps
def defaultFactories(func):
    'wraps function to use factories instead of values for defaults in call'
    defaults = func.func_defaults
    @wraps(func)
    def wrapped(*args,**kwargs):
        func.func_defaults = tuple(default() for default in defaults)
        return func(*args,**kwargs)
    return wrapped

def f1(n,b = []):
    b.append(n)
    if n == 1: return b
    else: return f1(n-1) + b

@defaultFactories
def f2(n,b = list):
    b.append(n)
    if n == 1: return b
    else: return f2(n-1) + b

>>> f1(6)
[6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1]
>>> f2(6)
[1, 2, 3, 4, 5, 6]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X