Как замкнуть функцию с помощью декораторов Python? - PullRequest
0 голосов
/ 12 февраля 2019

Скажем, у меня есть функция F, которая может возвращать логическое значение false.Если у меня есть вызывающий по имени main (), который будет вызывать F в нескольких местах, могу ли я прикрепить декоратор к F, который распространит возвращаемое значение и заставит его родителя (main) также рано завершиться?

1 Ответ

0 голосов
/ 12 февраля 2019

Никакая функция не может «вернуться» в контекст выше, чем ее вызывающий.Это (насколько мне известно) является универсальным в большинстве языков программирования.Вероятно, вы могли бы взломать его, проверив состояние python и стек вызовов, но гораздо лучшим / более подходящим решением было бы обернуть main в блок try: except:, который перехватывает пользовательское исключение, которое вы вызываете внутри этого декоратора в зависимости от вывода F()

import random
from functools import wraps

class ShortCircuit(Exception):
    pass

def short_circuit(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        res = f(*args, **kwargs)
        if not res:
            raise ShortCircuit()
        else:
            return res
    return wrapped

@short_circuit
def F():
    return random.choice([True, False])

def main():
    print(F())
    print(F())

if __name__=="__main__":
    try:
        main()
    except ShortCircuit:
        print("short circuited")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...