Никакая функция не может «вернуться» в контекст выше, чем ее вызывающий.Это (насколько мне известно) является универсальным в большинстве языков программирования.Вероятно, вы могли бы взломать его, проверив состояние 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")