3 ms·
The disassembly in parent comment is made with CPython 3.6.9, but nothing substantial changes on CPython 3.8.x/3.9.x or PyPy. Maybe it is related to grammar, a
by vanni 6y ago
The disassembly in parent comment is made with CPython 3.6.9, but nothing substantial changes on CPython 3.8.x/3.9.x or PyPy.
Maybe it is related to grammar, and not to compiler...
AST dump in CPython 3.6.9 (manually formatted):
In [1]: import ast
In [2]: print(ast.dump(ast.parse("""\
...: def a():
...: return (1 in [1,2,3] is True)""")))
Module(
body=[
FunctionDef(
name='a',
args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
body=[
Return(
value=Compare(
left=Num(n=1),
ops=[In(), Is()],
comparators=[
List(elts=[Num(n=1), Num(n=2), Num(n=3)], ctx=Load()),
NameConstant(value=True)
]
)
)
],
decorator_list=[],
returns=None
)
]
)
In [3]: print(ast.dump(ast.parse("""\
...: def b():
...: return ((1 in [1,2,3]) is True)""")))
Module(
body=[
FunctionDef(
name='b',
args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
body=[
Return(
value=Compare(
left=Compare(
left=Num(n=1),
ops=[In()],
comparators=[List(elts=[Num(n=1), Num(n=2), Num(n=3)], ctx=Load())]
),
ops=[Is()],
comparators=[NameConstant(value=True)]
)
)
],
decorator_list=[],
returns=None
)
]
)
- vanni 6y agoOK, mystery solved. In Python: 1 in [1,2,3] is True is evaluated as (1 in [1, 2, 3]) and ([1, 2, 3] is True) similarly to 1 < 2 < 3 :facepalm: