En python, pourquoi 0xbin () renvoie-t-il False?

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

 >>> 0xbin() False 

Pourquoi ça arrive? Cette syntaxe ne devrait avoir aucun sens. Les fonctions ne peuvent pas commencer par 0, il n’y a pas de “i” et “n” en hexadécimal et la fonction bin doit avoir des arguments.

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

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 

Vous pouvez utiliser le tokenizer de Python pour vérifier!

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

Cela imprime les jetons dans votre chaîne, séparés par des espaces. Dans ce cas, le résultat sera:

 0xb in ( ) 

En d’autres termes, il retourne False car le nombre 11 ( 0xb ) n’est pas dans le tuple vide ( () ).

(Merci à Roman Odaisky pour avoir suggéré l’utilisation de tokenize dans les commentaires!)

EDIT: Pour expliquer le code un peu plus en détail: la fonction tokenize attend des entrées dans un format un peu étrange, donc io.BytesIO(line).readline est une fonction qui transforme une séquence d’octets en un tokenize pouvant être lu. tokenize alors le tokenise et retourne une série de namedtuple s; nous prenons la chaîne représentant chacun d’eux et les joignons avec des espaces. Le type != 59 partie est utilisé pour ignorer le spécificateur de codage qui serait sinon affiché au début.

Vous pouvez utiliser le module AST pour obtenir l’ arbre de syntaxe abstrait 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 la grammaire abstraite pour savoir comment interpréter l’expression, mais tl; dr: Num(n=11) est la partie 0xb et Tuple(elts=[], ...) allusion à un tuple vide plutôt qu’à un appel de fonction.