195 votes

En python, pourquoi 0xbin () renvoie False?

La saisie de la commande 0xbin() renvoie False:

 >>> 0xbin()
False
 

Pourquoi cela se produit-il? Cette syntaxe ne devrait avoir aucun sens. Les fonctions ne peuvent pas commencer par 0, il n'y a ni "i" ni "n" en hexadécimal, et la fonction bin doit avoir des arguments.

231voto

YSelf Points 2343

Python semble interpréter 0xbin() comme 0xb in () , ce qui signifie onze dans un tuple vide. La réponse est non, donc False .

143voto

Chris_Rands Points 15161

Si vous démontez le code, vous verrez que la réponse de Yself , qui mentionne que 0xbin() est interprété comme 0xb in () , est confirmée:

 >>> import dis
>>> dis.dis('0xbin()')
  1           0 LOAD_CONST               0 (11)
              2 BUILD_TUPLE              0
              4 COMPARE_OP               6 (in)
              6 RETURN_VALUE
 

64voto

Draconis Points 1109

Vous pouvez utiliser Python propre générateur de jetons pour vérifier!

import tokenize
import io
line = b'0xbin()'
print(' '.join(token.string for token in tokenize.tokenize(io.BytesIO(line).readline) if token.type!=59))

Il imprime les jetons dans votre chaîne de caractères, séparés par des espaces. Dans ce cas, le résultat sera:

0xb in ( ) 

En d'autres termes, elle renvoie Faux car le nombre 11 (0xb) n'est pas dans le vide d'un n-uplet (()).

(Merci à Romain Odaisky pour ce qui suggère l'utilisation de l' tokenize dans les commentaires!)

EDIT: Pour expliquer un peu le code de manière plus approfondie: l' tokenize fonction attend l'entrée dans un peu bizarre format, io.BytesIO(line).readline est une fonction qui transforme une séquence d'octets en quelque chose d' tokenize peuvent lire. tokenize alors tokenizes et renvoie à une série d' namedtuples; nous prenons la chaîne de caractères représentant chacun et de se joindre à eux avec des espaces. L' type != 59 partie est utilisée pour ignorer l'encodage spécificateur qui seraient autrement apparaître au début.

54voto

Pål GD Points 412

Vous pouvez utiliser l' AST module pour obtenir l' arbre de syntaxe abstraite de l'expression:

>>> import ast
>>> m = ast.parse('0xbin()')
>>> ast.dump(m)
'Module(
    body=[Expr(
               value=Compare(left=Num(n=11),
                             ops=[In()],
                             comparators=[Tuple(elts=[],
                                                ctx=Load())
                                         ]
                            ))])'

Voir le résumé de la grammaire de la façon d'interpréter l'expression, mais tl;dr: Num(n=11) est le 0xb partie, et Tuple(elts=[], ...) conseils vers un tuple vide plutôt que d'un appel de fonction.

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