65 votes

Est-ce que Pythonic utilise des bools comme ints?

False est équivalent à 0 et True est équivalent 1 sorte qu'il est possible de faire quelque chose comme ceci:

 def bool_to_str(value):
    """value should be a bool"""
    return ['No', 'Yes'][value]

bool_to_str(True)
 

Notez que la valeur est bool mais est utilisée comme int .

Est-ce que c'est ce genre d'utilisation Pythonic ou faut-il l'éviter?

162voto

Alex Martelli Points 330805

Je vais être l'étrange voix (car toutes les réponses sont en dénonçant l'utilisation du fait qu' False == 0 et True == 1, comme la langue des garanties) que je prétends que l'utilisation de ce fait, afin de simplifier votre code est parfaitement bien.

Historiquement, la logique (true/false) ont tendance à simplement utiliser 0 pour faux et 1 pour vrai; dans le cours de Python 2.2 cycle de vie, Guido remarqué que de trop nombreux modules commencé avec des tâches telles que l' false = 0; true = 1 et ce produit réutilisable et inutile variation (cette dernière en raison de la capitalisation du vrai et du faux était tous sur la place-des majuscules, des minuscules, certains cap-initial) et introduit la bool sous-classe de la int et son True et False des constantes.

Il y avait assez de refoulement à l'époque comme beaucoup d'entre nous craignaient que le nouveau type et constantes serait utilisé par Python débutants à restreindre la langue des capacités, mais Guido était inflexible sur le fait que nous étions juste en étant pessimiste: personne ne serait jamais comprendre Python si mal, par exemple, pour éviter de les parfaitement naturel l'utilisation de False et True liste des indices, ou à une sommation, ou d'autres parfaitement clair et utile d'expressions idiomatiques.

Les réponses à ce fil prouver que nous étions droite: comme nous le craignions, une totale incompréhension des rôles de ce type et les constantes a émergé, et les gens sont à éviter, et, pire!, inciter les autres à éviter, parfaitement naturelle Python constructions en faveur de l'inutile girations.

La lutte contre la marée de ce malentendu, j'exhorte tout le monde à utiliser Python comme Python, ne pas essayer de le forcer dans le moule des autres langues dont la fonctionnalité et style préféré sont tout à fait différents. En Python, le Vrai et le Faux sont à 99,9% comme le 1 et le 0, qui diffèrent exclusivement dans leur str(...) (et, partant, repr(...)) -- pour toute autre opération, à l'exception de stringification, n'hésitez pas à les utiliser sans contorsions. Qui va pour l'indexation, l'arithmétique, les opérations sur les bits, etc, etc, etc.

145voto

Guido van Rossum Points 11152

Je suis avec Alex. False==0 et True==1, et il n'y a rien de mal à cela.

Encore, dans Python 2.5 et plus tard j'aimerais écrire la réponse à cette question en particulier, à l'aide de Python expression conditionnelle:

def bool_to_str(value):
  return 'Yes' if value else 'No'

De cette façon, il n'y a pas d'obligation que l'argument est en fait un bool, un peu comme if x: ... accepte tout type de x, bool_to_str() fonction doit faire la bonne chose quand il est passé à Aucun, un string, une liste, ou 3.14.

37voto

SilentGhost Points 79627

sûrement:

 def bool_to_str(value):
    "value should be a bool"
    return 'Yes' if value else 'No'
 

est plus lisible.

13voto

minhee Points 1345

Votre code semble inexact dans certains cas:

 >>> def bool_to_str(value):
...     """value should be a bool"""
...     return ['No', 'Yes'][value]
...
>>> bool_to_str(-2)
'No'
 

Et je vous recommande d'utiliser uniquement l'opérateur conditionnel pour plus de lisibilité:

 def bool_to_str(value):
    """value should be a bool"""
    return "Yes" if value else "No"
 

5voto

EOL Points 24342

C'est une fonction de la langue que de Faux == 0 et True == 1 (elle ne dépend pas de la mise en œuvre): Est Fausse == 0 et True == 1 en Python un détail d'implémentation, ou est-il garanti par la langue?

Cependant, je suis d'accord avec la plupart des autres réponses: il y a de plus lisible de façons d'obtenir le même résultat qu' ['No', 'Yes'][value], grâce à l'utilisation de l' … if value else … ou d'un dictionnaire, qui ont les avantages respectifs de la consigne et en déclarant qu' value est une valeur booléenne.

De Plus, l' … if value else … suit la convention de non-0 est Vrai: il fonctionne aussi même lorsqu' value == -2 (la valeur est True (vraie), comme évoqué par dahlia. La liste et dict approches ne sont pas aussi robustes, dans ce cas, je ne voudrais pas le recommander.

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