Динамическое определение фиктивного декоратора - PullRequest
1 голос
/ 31 марта 2020

Я использую хороший инструмент под названием https://github.com/rkern/line_profiler

Чтобы использовать его, вам нужно поместить декоратор @profile в несколько мест в скрипте, чтобы указать, какие функции должны быть профнастил. Затем вы выполняете сценарий с помощью kernprof -l script_to_profile.py

Очевидно, что при запуске сценария самостоятельно с помощью python script_to_profile.py декоратор не определен и, следовательно, сценарий падает.

Я знаю, как определить я могу передать флаг из командной строки и определить его в основном скрипте в зависимости от того, как установлен флаг. Однако я не знаю, как передать определение декоратора (или флаг) загружаемым модулям, чтобы они не обрабатывали sh в момент загрузки. Есть идеи?

def profile(func):
        return func

1 Ответ

1 голос
/ 31 марта 2020

Очень простым способом было бы проверить, существует ли что-то с именем profile, а если нет, то определите его как декоратор вашей идентичности. Примерно так.

try:
    profile
except NameError:
    def profile(func):
        return func

Вы могли бы go немного продвинуться и убедиться, что это что-то вызываемое - вероятно, не нужно:

import typing

try:
    profile
except NameError:
    profile = None

if not isinstance(profile, typing.Callable):
    def profile(func):
        return func
...