Где обернуть функцию - PullRequest
       35

Где обернуть функцию

0 голосов
/ 28 октября 2019

Для функции-обертки почему не работает следующий подход:

# 3. DISALLOW EXECUTION IN MAIN
def disallow_main(func):
    if __name__ == '__main__':
        raise RuntimeError("Cannot run from main.")
    return func

@disallow_main
def echo(prompt='-> '):
    _inp = input(prompt)
    print ("ECHO: %s" % _inp)

То есть, почему он поднимается до определения функции? Как правильно создать обертку?

1 Ответ

0 голосов
/ 28 октября 2019

Как отмечено в комментариях, это объясняет, почему проверка происходит в то время, когда она есть, но все равно не делает то, что вы хотите. Эта проверка только проверяет, является ли модуль, содержащий disallow_main, __main__ или нет;нет, если код вызова __main__. Вам понадобится более сложная проверка, чтобы сделать именно то, что вам нужно.


Вам нужно обернуть переданную функцию в функцию-обертку, которая выполняет проверку. Вы выполняете проверку при запуске декоратора, которая отделена от того, когда вызывается функция.

def disallow_main(func):
    def wrapper(*args):
        if __name__ == '__main__':
            raise RuntimeError("Cannot run from main.")
        else:
            func(*args)

    return wrapper

Обратите внимание, как возвращается wrapper, и она вызывает func после завершения проверки.

...