代码之家  ›  专栏  ›  技术社区  ›  MattS

在python中,为什么0xbin()返回False?[副本]

  •  190
  • MattS  · 技术社区  · 7 年前

    这个问题已经有了答案:

    输入命令 0xbin() 返回False:

    >>> 0xbin()
    False
    

    为什么会这样?这个语法应该没有任何意义。函数不能以0开头,十六进制中没有“i”和“n”,bin函数必须有一些参数。

    4 回复  |  直到 7 年前
        1
  •  230
  •   YSelf    7 年前

    Python似乎可以解释 0xbin() 作为 0xb in () ,表示空元组中的11。 答案是否定的,因此 False .

        2
  •  139
  •   Bhargav Rao rlgjr    7 年前

    如果你反汇编代码,你会看到 Yself's answer ,其中提到 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
    
        3
  •  61
  •   Draconis    7 年前

    您可以使用Python自己的标记器来检查!

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

    这将打印字符串中的标记,用空格分隔。在这种情况下,结果将是:

    0xb in ( ) 
    

    换句话说,它返回False,因为数字11( 0xb )不在空元组中( () ).

    (感谢Roman Odaisky建议使用 tokenize 在评论中!)

    编辑:为了更彻底地解释代码: 标记化 函数要求输入的格式有点奇怪,所以 io.BytesIO(line).readline 是一个将字节序列转换为 标记化 会读书。 标记化 然后标记它并返回一系列 namedtuple 我们取代表每个字符串的字符串,并用空格将它们连接起来。这个 type != 59 part用于忽略在开头显示的编码说明符。

        4
  •  53
  •   Mark Amery Harley Holcombe    7 年前

    你可以使用 AST 获取 abstract syntax tree 表达方式:

    >>> 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())
                                             ]
                                ))])'
    

    abstract grammar 如何解释这个表达式,但是tl;dr: Num(n=11) 0xb 部分,和 Tuple(elts=[], ...) 指向空元组而不是函数调用的提示。