После некоторого времени поиска здесь дубликатов единственное, что я нахожу, это отсутствие операций и оптимизация с Cython, который совершенно не связан. Что я пытаюсь сделать, это динамически установить флаг python -O
во время выполнения .
По сути, есть одно значение sys.flags.optimize
, которое доступно только для чтения. Я ищу вариант, чтобы изменить его или найти место, в котором это значение может быть изменено и влияет на генерацию байт-кода.
В соответствии с doc официальный способ - назвать егопрежде чем переводчик раскрутится, так что мне интересно, если это вообще возможно, однако вот что я нашел:
Кажется, что py_compile
называется "где-то"Msgstr "(Поиск в GitHub показывает только документ или тесты, а не фактический вызывающий во время выполнения) и управляет optimization_level
в compiler.c
сверху. Это означало бы, что я могу изменить его в Python и заставить скомпилированный интерпретатор собрать мой код с и без оптимизаций в одном сеансе / процессе.
Я не могу найти синтаксический анализ параметров CLI, ни каких-либо связанных "состояние ", которое можно изменить во время выполнения.
Моя цель (на данный момент) - опционально разрешить / удалить ключевое слово assert
, что может быть сделано только -O
(через compiler_assert()
* 1042). * для этого нужен установленный уровень, однако я изо всех сил пытаюсь найти «недостающую связь» между CST, строящим код C, и реальным кодом Python, который, кажется, содержит состояние конфигурации (поскольку py_compile
содержит необработанные значения optimize
) ипохоже компилирует и загружает байт-код для самого интерпретатора.
Есть ли способ изменить optimization_level
, чтобы я мог добиться такого поведения и в значительной степени сделать это за один сеанс Python?
>>> # change optimize to 1
>>> def test(): assert True
>>> import dis
>>> dis.dis(test)
1 0 LOAD_CONST 0 (None)
2 RETURN_VALUE
>>> # change optimize to 0
>>> dis.dis(test)
1 0 LOAD_CONST 1 (True)
2 POP_JUMP_IF_TRUE 8
4 LOAD_GLOBAL 0 (AssertionError)
6 RAISE_VARARGS 1
>> 8 LOAD_CONST 0 (None)
10 RETURN_VALUE