输入命令0xbin()
返回False:
>>> 0xbin()
False
Run Code Online (Sandbox Code Playgroud)
为什么会这样?这种语法应该没有任何意义.函数不能以0开头,十六进制中没有"i"和"n",bin函数必须有一些参数.
YSe*_*elf 230
Python似乎解释0xbin()
为0xb in ()
,在一个空元组中意味着十一.答案是否定的False
.
Chr*_*nds 139
如果您反汇编代码,您将看到Yself的答案,其中提到0xbin()
被解释为0xb in ()
,已得到确认:
>>> import dis
>>> dis.dis('0xbin()')
1 0 LOAD_CONST 0 (11)
2 BUILD_TUPLE 0
4 COMPARE_OP 6 (in)
6 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
Dra*_*nis 61
你可以使用Python自己的tokenizer来检查!
import tokenize
import io
line = b'0xbin()'
print(' '.join(token.string for token in tokenize.tokenize(io.BytesIO(line).readline) if token.type!=59))
Run Code Online (Sandbox Code Playgroud)
这将打印字符串中的标记,以空格分隔.在这种情况下,结果将是:
0xb in ( )
Run Code Online (Sandbox Code Playgroud)
换句话说,它返回False,因为数字11(0xb
)不在空元组(()
)中.
(感谢Roman Odaisky建议tokenize
在评论中使用!)
编辑:更彻底地解释代码:tokenize
函数需要输入一些奇怪的格式,因此io.BytesIO(line).readline
是一个将字节序列转换为tokenize
可读取的字符的函数.tokenize
然后将其标记并返回一系列namedtuple
s; 我们取代表每一个的字符串并将它们与空格连接在一起.该type != 59
部分用于忽略否则将在开头显示的编码说明符.
Pål*_* GD 53
>>> 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())
]
))])'
Run Code Online (Sandbox Code Playgroud)
请参阅抽象语法以了解如何解释表达式,但tl; dr:Num(n=11)
是0xb
部分,并Tuple(elts=[], ...)
提示空元组而不是函数调用.