a_cfg_dg_zsq.py 622 B

1234567891011121314151617181920212223
  1. # !/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import sys
  4. from functools import wraps
  5. class TailRecurseException(BaseException):
  6. def __init__(self, args):
  7. self.args = args
  8. def tail_call_optimized(g):
  9. @wraps(g)
  10. def func(*args):
  11. f = sys._getframe()
  12. if f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code:
  13. raise TailRecurseException(args)
  14. else:
  15. while 1:
  16. try:
  17. return g(*args)
  18. except TailRecurseException as e:
  19. args = e.args
  20. func.__doc__ = g.__doc__
  21. return func