title in python plot
En Python, ¿por qué 0xbin() devuelve False? (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Por qué no es esto un error de sintaxis en python? 3 respuestas
Ingresando el comando
0xbin()
devuelve False:
>>> 0xbin()
False
¿Por qué sucede eso? Esta sintaxis no debería tener ningún significado en absoluto. Las funciones no pueden comenzar con 0, no hay "i" y "n" en hexadecimal, y la función bin debe tener algunos argumentos.
¡Puedes usar el propio tokenizer de Python para comprobarlo!
import tokenize
import io
line = b''0xbin()''
print('' ''.join(token.string for token in tokenize.tokenize(io.BytesIO(line).readline) if token.type!=59))
Esto imprime los tokens en su cadena, separados por espacios. En este caso, el resultado será:
0xb in ( )
En otras palabras, devuelve False porque el número 11 (
0xb
) no está en la tupla vacía (
()
).
(¡Gracias a Roman Odaisky por sugerir el uso de
tokenize
en los comentarios!)
EDITAR: Para explicar el código un poco más a fondo: la función
tokenize
espera que se ingrese en un formato un poco extraño, por lo que
io.BytesIO(line).readline
es una función que convierte una secuencia de bytes en algo que
tokenize
puede leer.
tokenize
luego tokenizes y devuelve una serie de
namedtuple
s;
Tomamos la cadena que representa a cada una y las unimos con espacios.
La parte
type != 59
se usa para ignorar el especificador de codificación que, de lo contrario, se mostraría al principio.
Puede usar el módulo AST para obtener el árbol de sintaxis abstracta de la expresión:
>>> 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())
]
))])''
Vea la
gramática abstracta
para
saber
cómo interpretar la expresión, pero tl; dr:
Num(n=11)
es la parte
0xb
, y
Tuple(elts=[], ...)
insinúa una tupla vacía en lugar de una llamada de función.
Python parece interpretar
0xbin()
como
0xb in ()
, lo que significa que es once en una tupla vacía.
La respuesta es no, por lo tanto
False
.
Si desarma el código, verá que
la respuesta de Yself
, que menciona que
0xbin()
se interpreta como
0xb in ()
, se confirma:
>>> import dis
>>> dis.dis(''0xbin()'')
1 0 LOAD_CONST 0 (11)
2 BUILD_TUPLE 0
4 COMPARE_OP 6 (in)
6 RETURN_VALUE