1234567891011121314151617181920212223 |
- # !/usr/bin/env python
- # -*- coding:utf-8 -*-
- import sys
- from functools import wraps
- class TailRecurseException(BaseException):
- def __init__(self, args):
- self.args = args
- def tail_call_optimized(g):
- @wraps(g)
- def func(*args):
- f = sys._getframe()
- if f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code:
- raise TailRecurseException(args)
- else:
- while 1:
- try:
- return g(*args)
- except TailRecurseException as e:
- args = e.args
- func.__doc__ = g.__doc__
- return func
|