[Python-Dev] #12982: Should -O be required to read .pyo files? (original) (raw)

Nick Coghlan ncoghlan at gmail.com
Thu Jun 14 03:48:08 CEST 2012


On Thu, Jun 14, 2012 at 6:06 AM, Terry Reedy <tjreedy at udel.edu> wrote:

On 6/13/2012 2:46 PM, Antoine Pitrou wrote:

Not only docstrings, but also asserts. I think running a pyo without -O would be a bug. That cat is already out of the bag ;-) People are doing that now by renaming x.pyo to x.pyc. Brett claims that it is also easy to do in 3.3 with a custom importer.

Right, but by resorting to either of those approaches, people are clearly doing something that isn't formally supported by the core. Yes, you can do it, and most of the time it will work out OK, but any weird glitches that result are officially not our problem.

The main reason this matters is that the "debug" flag is supposed to be process global - if you check it in one place, the answer should be correct for all Python code loaded in the process. If you load a .pyo file into a process running without -O (or a .pyc file into a process running with -O), then you have broken that assumption. Because the compiler understands debug, and is explicitly free to make optimisations based on the value of that flag at compile time (such as throwing away unreachable branches in if statements or applying constant folding operations), the following code will do different things if loaded from a .pyo file instead of .pyc:

print("__debug__ is not a builtin, it is checked at compile time")
if __debug__:
    print("A .pyc file always has __debug__ == True")
else:
    print("A .pyo file always has __debug__ == False")

$ ./python -c "import foo" debug is not a builtin, it is checked at compile time A .pyc file always has debug == True $ ./python -O -c "import foo" debug is not a builtin, it is checked at compile time A .pyo file always has debug == False $ ./python pycache/foo.cpython-33.pyo debug is not a builtin, it is checked at compile time A .pyo file always has debug == False $ ./python -O pycache/foo.cpython-33.pyc debug is not a builtin, it is checked at compile time A .pyc file always has debug == True

Cheers, Nick.

-- Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-Dev mailing list