2 votes

Est-ce que x = None ou object() equals to explicit check ?

J'ai une déclaration de fonction comme :

def function(list_of_objects = None)

et si *list_of_objects* n'est pas passée (est None), je dois la définir comme une liste vide. La méthode explicite est la suivante :

def function(list_of_objects = None):
    if not list_of_objects:
        list_of_objects = list()

o

def function(list_of_objects = None):
    list_of_objects = list() if not list_of_objects else list_of_objects

Le code ci-dessus est-il égal au code suivant ?

def function(list_of_objects = None):
    list_of_objects = list_of_objects or list()

Je l'ai testé, mais je ne suis toujours pas sûr.

>>> def func(my_list = None):
...     my_list = my_list or list()
...     print(type(my_list), my_list)
... 
>>> func()
(<type 'list'>, [])
>>> func(['hello', 'world'])
(<type 'list'>, ['hello', 'world'])
>>> func(None)
(<type 'list'>, [])
>>>

7voto

Non, puisque None n'est pas le seul objet faux. Sont également inclus [] , () , 0 et bien sûr False .

3voto

J.F. Sebastian Points 102961

La façon idiomatique est :

def function(list_of_objects=None):
    if list_of_objects is None:
        list_of_objects = []

None est un singleton, vous pouvez donc utiliser is pour la comparaison.

Votre code teste la véracité de list_of_objects (tous if y or sont équivalentes dans ce cas). Les valeurs suivantes sont considérées comme fausses en Python :

  • Aucun

  • Faux

  • zéro de n'importe quel type numérique, par exemple, 0 , 0.0 , 0j .

  • toute séquence vide, par exemple, '' , () , [] .

  • toute cartographie vide, par exemple, {} .

  • les instances des classes définies par l'utilisateur, si la classe définit une __bool__() o __len__() lorsque cette méthode renvoie la valeur entière zéro ou la valeur bool False.

Toutes les autres valeurs sont considérées comme vraies - ainsi, les objets de plusieurs types sont toujours vrais.

2voto

Raymond Hettinger Points 231

La pratique habituelle est la suivante :

def function(list_of_objects=None):
    if list_of_objects is None:
        list_of_objects = []
    ...

Utilisez Aucun parce qu'il est facile de le distinguer d'autres valeurs fausses telles qu'une liste vide ou un tuple vide.

Utilisez un is None au lieu du test d'égalité, car Aucun est un singleton (c'est la pratique préférée, selon le PEP 8 ).

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