2010-10-14 7 views

Répondre

3

Dans ce cas particulier, c'est mauvais car une liste vide est évaluée à false. Si vous muter la liste, les résultats ne seront pas comme prévu

def func(x=None): 
    x = x or [] 
    x.append('hello') 

mylist = [] 
func(mylist) 
print mylist[0] # doesn't work 

Puisque vous voulez vérifier si l'appelant a adopté None ou non, vous devez simplement dire que explicitement et ne pas essayer d'être intelligent. Les objets tels que [], (), {}, 0 et False sont fausses, tout objet défini par l'utilisateur qui souhaite vérifier la présence de fausses valeurs peut réellement détecter trop de faux positifs.

(aussi: Utilisation is None au lieu de == Nonecan be faster and more reliable.)

2

x or [] retourne une liste vide si bool(x) est faux. None est faux, mais les zéros (ints, longs, flottants, etc.) et les collections vides ([], {}, "", etc.) sont également faux. Donc ce n'est pas attraper None, c'est attraper l'objet falsifié - ce qui n'est pas équivalent à x == None et probablement pas ce que vous voulez (collections vides sont des entrées parfaitement valides pour de nombreux algorithmes). Oh, et alors que nous y sommes: Cela devrait être x is None - is est le choix sémantiquement correct (et propably plus rapide) pour tester l'identité. == peut être remplacé par x, et vous ne pouvez pas être sûr qu'il ne considérera pas None égal à lui-même ou même casser dessus.

1

Je pense que le meilleur langage pour vérifier tout singleton python est:

if x is None: 
    x = [] 

La raison est que certains objets comme des objets ORM dans django ou sqlalchemy, par exemple, sont paresseux (ils ne seront pas appeler la base de données jusqu'au dernier moment possible). L'utilisation des autres options pour vérifier None peut déclencher l'évaluation d'une opération coûteuse.

Questions connexes