Хотя я думаю, что вопрос совершенно ясен и действителен (несмотря на многочисленные ответы, которые говорят об обратном), краткий ответ: «В Python для этого нет поддержки».
Единственное потенциальное решение, кроме предложения препроцессора , заключается в использовании взлома байт-кода . Я даже не стану представлять, как это должно работать с точки зрения API высокого уровня, но на низком уровне вы можете себе представить изучение объектов кода для определенных последовательностей инструкций и переписывание их для их устранения.
Например, посмотрите на следующие две функции:
>>> def func():
... if debug: # analogous to if __debug__:
... foo
>>> dis.dis(func)
2 0 LOAD_GLOBAL 0 (debug)
3 JUMP_IF_FALSE 8 (to 14)
6 POP_TOP
3 7 LOAD_GLOBAL 1 (foo)
10 POP_TOP
11 JUMP_FORWARD 1 (to 15)
>> 14 POP_TOP
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
Здесь вы можете отсканировать LOAD_GLOBAL
из debug
и устранить его и все, вплоть до цели JUMP_IF_FALSE
.
Это более традиционная функция debug () в стиле C, которая хорошо стирается препроцессором:
>>> def func2():
... debug('bar', baz)
>>> dis.dis(func2)
2 0 LOAD_GLOBAL 0 (debug)
3 LOAD_CONST 1 ('bar')
6 LOAD_GLOBAL 1 (baz)
9 CALL_FUNCTION 2
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
Здесь вы должны найти LOAD_GLOBAL
из debug
и стереть все до соответствующего CALL_FUNCTION
.
Конечно, оба этих описания того, что вы будете делать, гораздо проще, чем то, что вам действительно нужно для всех, кроме самых упрощенных моделей использования, но я думаю, что это было бы осуществимо. Сделал бы симпатичный проект, если бы никто еще не сделал это.