GeezerVison is showing github.com — compile(optimize=2) doesn't del docstrings/asserts, ignores -OO & PYTHONOPTIMIZE=2 · Issue #112909 · python/cpython
compile(optimize=2) doesn't del docstrings/asserts, ignores -OO & PYTHONOPTIMIZE=2 #112909DescriptionBug report
Bug description:
import ast
py_test_source = '''
def test() :
"""docstring"""
assert True
...
'''
ast_obj = compile( # https://docs.python.org/library/functions.html#compile
source = py_test_source ,
filename = "" ,
mode = "exec" ,
flags = ast.PyCF_ONLY_AST ,
dont_inherit = 1 ,
optimize = 2 ,
)
print( ast.unparse( ast_obj ) )
as i understand the compile() documentation ,
the above example should remove the docstring ,
and the assert line , but it doesn't .
setting the env var PYTHONOPTIMIZE=2 and then
running python with the cmdLine option -OO
this time with
a) compile( ... , dont_inherit=False , ... ) without optimize
b) compile( ... , dont_inherit=0 , ... ) without optimize
c) compile( ... ) without : dont_inherit , optimize
didn't chage the outcome :
compile() never removes docstrings/asserts .
looks like compile() ignores its arg optimize=2
and -OO and PYTHONOPTIMIZE=2 .
CPython versions tested on:
3.11.5
Operating systems tested on:
Windows 10 (22H2) 64bit Activitychanged the title [-]compile( optimize=2 ) doesn't del docstrings , ignores -OO & PYTHONOPTIMIZE=2[/-] [+]compile( optimize=2 ) doesn't del asserts/docstrings , ignores -OO & PYTHONOPTIMIZE=2[/+] on Dec 9, 2023changed the title [-]compile( optimize=2 ) doesn't del asserts/docstrings , ignores -OO & PYTHONOPTIMIZE=2[/-] [+]compile( optimize=2 ) doesn't del docstrings/asserts , ignores -OO & PYTHONOPTIMIZE=2[/+] on Dec 9, 2023terryjreedy commented on Dec 10, 2023 The doc says "The argument optimize specifies the optimization level of the compiler;". With the PyCF_ONLY_AST, you are only running the parser, not the compiler itself. If the parser stripped docstrings and assert statements, then unparse would not work right. Also, def f(): "docstring"` would not compile as the docstring is, here, the required non-empty suite.
If you compile to a code object and exec the code object, the resulting test function object will not have a docstring or assert.
test = '''\
def test() :
"""docstring"""
assert False
'''
exec(compile(
source = test,
filename = "" ,
mode = "exec" ,
# flags = ast.PyCF_ONLY_AST ,
dont_inherit = 1 ,
optimize = 2 ,
))
print(test.__doc__, test()) # prints `None None`
Perhaps the doc could be clearer to Python learners, but I am not sure how. dreamflow commented on Dec 10, 2023 ContributorAuthor More actions thank you terryjreedy for the detailed explanation 🙂 changed the title [-]compile( optimize=2 ) doesn't del docstrings/asserts , ignores -OO & PYTHONOPTIMIZE=2[/-] [+]compile(optimize=2 ) doesn't del docstrings/asserts , ignores -OO & PYTHONOPTIMIZE=2[/+] on Dec 10, 2023changed the title [-]compile(optimize=2 ) doesn't del docstrings/asserts , ignores -OO & PYTHONOPTIMIZE=2[/-] [+]compile(optimize=2) doesn't del docstrings/asserts, ignores -OO & PYTHONOPTIMIZE=2[/+] on Dec 10, 2023carljm commented on Dec 17, 2023
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|