“foo in bar == baz”的奇怪案例

时间:2017-04-24 19:59:27

标签: python

在查看另一个问题时,新的提问者使用了以下形式的表达式:

foo in bar == baz

我开始解释Python如何解释该表达式,但很快意识到我实际上并不知道Python如何解释该表达式。懒得查看操作顺序,我认为它必须等同于:

(foo in bar) == baz

或者:

foo in (bar == baz)

我从一些测试中发现,这些都不是真的。进一步挖掘,两个带括号的语句的字节码非常简单:

>>> dis(lambda foo, bar, baz:(foo in bar) == baz)
  1           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               6 (in)
              9 LOAD_FAST                2 (baz)
             12 COMPARE_OP               2 (==)
             15 RETURN_VALUE
>>> dis(lambda foo, bar, baz:foo in (bar == baz))
  1           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 LOAD_FAST                2 (baz)
              9 COMPARE_OP               2 (==)
             12 COMPARE_OP               6 (in)
             15 RETURN_VALUE 

但是,朴实的版本的字节码更有趣:

>>> dis(lambda foo, bar, baz:foo in bar == baz)
  1           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 DUP_TOP
              7 ROT_THREE
              8 COMPARE_OP               6 (in)
             11 JUMP_IF_FALSE_OR_POP    21
             14 LOAD_FAST                2 (baz)
             17 COMPARE_OP               2 (==)
             20 RETURN_VALUE
        >>   21 ROT_TWO
             22 POP_TOP
             23 RETURN_VALUE

从我对字节码的基本把握,这看起来相当于:

if foo in bar:
    return bar == baz
else:
    return False

我完全不知道这种结构的目的是什么。我偶然发现了一些深奥的速记吗?这是其他一些语法的副作用吗?

0 个答案:

没有答案