2010-06-10 6 views
7

Une des idées de la philosophie de conception de Python est "Il devrait y avoir une ... façon évidente de le faire." (PEP 20), mais cela ne peut pas toujours être vrai. Je me réfère spécifiquement à (simple) si les déclarations par rapport à l'évaluation booléenne. Considérez ce qui suit:Style Python: si déclarations vs évaluation booléenne

if words: 
    self.words = words 
else: 
    self.words = {} 

contre

self.words = words or {} 

Avec une telle situation simple, ce qui est préférable, stylistiquement parlant? Avec des situations plus compliquées, on choisirait l'instruction if pour la lisibilité, n'est-ce pas?

+0

La fonctionnalité bat la pureté. –

+0

définitivement ou :) –

Répondre

9

"Il devrait être être seulement un" peut parfaitement être toujours vrai; c'est l'affirmation positive "là est un seul" qui ne peut pas - "devrait" implique une cible, un objectif, pas la possibilité de toujours l'atteindre (par exemple, pour les numéros a et b, interdisant soit b + a ou a + b serait tellement absurde qu'il ne peut tout simplement pas être "d'une seule manière" dans ce cas). Dans votre exemple, je serais d'accord que le or est préférable dans des cas suffisamment simples (quatre lignes pour faire ce qui peut être fait dans une ligne claire et lisible est une perte d'espace vertical) mais pas pour un prédicat de toute importance complexité. Décider de ce qui a «une complexité significative» est, bien sûr, un jugement.

0

(Edited)
bien dans un cas comme ci-dessous, je vote pour le si vous pensez expression conditionnelle

def somesuch(self, words=None): 
    self.words = words or {} 
    ... 

bien sûr, ce serait d'améliorer la lisibilité (vous pouvez le lire à haute voix de cette façon?) , vous pouvez essayer

self.words = words if words else {} 
+0

Vous avez raison! En fait, toute cette question a été inspirée en essayant de le faire avec une définition de classe et en trouvant que toutes mes instances partageaient le même attribut de dictionnaire. –

+1

-1: Vous ne voulez probablement pas faire cela (du moins pas en général) - les arguments par défaut mutables peuvent vous surprendre. Voir http://stackoverflow.com/questions/1132941/ par exemple. –

+0

@ Scott Griffiths: Pouah, désolé. Je n'ai pas encore souffert, je suppose que je n'y ai pas pensé. merci pour l'URL. donc ** pas d'arguments par défaut mutables ** en python.garde le -1, j'espère que cela m'aidera à me souvenir de la leçon –

2

Dans ce cas, je dirais "explicite est mieux que implicite". Quand quelqu'un lit votre code, il peut faire quelques suppositions. Ils peuvent supposer que les "mots" peuvent être soit un dict vide, soit un dict avec des données (manquant le cas quand il est None) Dans ce cas, ils pourraient être tentés d'optimiser votre code. Ils pourraient même avoir raison de le faire, s'il n'est pas indiqué n'importe où que vous pouvez obtenir une valeur None.

Si « mots » peuvent en fait pas, je vais essayer d'être clair à ce sujet avec:

self.words = words 
if words is None: 
    self.words = {} 

Ou peut-être un « autre » au lieu d'affectation inconditionnelle en premier. Dans tous les cas, de cette façon, vous documentez en quelque sorte le fait que None est une valeur attendue pour "mots".