eryksun added the comment:
If __debug__ were referenced from the code object's co_consts instead of
checking locals, globals and builtins (LOAD_NAME), then optimize=1 would work
consistently for a given code object.
Currently in 3.4.1:
>>> dis.dis(compile("if __debug__: x = 1", "", "exec", optimize=0))
1 0 LOAD_CONST 0 (1)
3 STORE_NAME 0 (x)
6 LOAD_CONST 1 (None)
9 RETURN_VALUE
>>> dis.dis(compile("if __debug__: x = 1", "", "exec", optimize=1))
1 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
>>> dis.dis(compile("x = __debug__", "", "exec", optimize=0))
1 0 LOAD_NAME 0 (__debug__)
3 STORE_NAME 1 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
>>> dis.dis(compile("x = __debug__", "", "exec", optimize=1))
1 0 LOAD_NAME 0 (__debug__)
3 STORE_NAME 1 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
With the current design, an exec can override builtins.__debug__ in globals or
locals:
>>> exec("print(__debug__)", globals(), {"__debug__": "spam"})
spam
----------
nosy: +eryksun
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue22091>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com