2012-07-31 6 views
3

파이썬 3.2는 새로운 모듈 recursive_reprreprlib 모듈에 도입했습니다. 내가 이해하지 못하는 것은 부트 스트랩 문제가 왜하지 @wraps(user_function)wrapper에 무엇을Functools의 "부트 스트랩 문제"가 장식자를 감싸고 있습니까?

def recursive_repr(fillvalue='...'): 
    'Decorator to make a repr function return fillvalue for a recursive call' 

    def decorating_function(user_function): 
     repr_running = set() 

     def wrapper(self): 
      key = id(self), get_ident() 
      if key in repr_running: 
       return fillvalue 
      repr_running.add(key) 
      try: 
       result = user_function(self) 
      finally: 
       repr_running.discard(key) 
      return result 

     # Can't use functools.wraps() here because of bootstrap issues 
     wrapper.__module__ = getattr(user_function, '__module__') 
     wrapper.__doc__ = getattr(user_function, '__doc__') 
     wrapper.__name__ = getattr(user_function, '__name__') 
     wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) 
     return wrapper 

    return decorating_function 

을 적용 할 수있다있다 : 나는 source code으로 보았을 때이 코드를 발견

?

답변

2

"부트 스트랩 문제"가 순환 종속성에서 오는 것처럼 보입니다. 이 경우 functoolscollections을 가져오고, 다시 reprlib을 가져옵니다. reprlibfunctools.wraps을 가져 오려고하면 암시 적으로 자체를 가져 오려고 시도하지만 작동하지 않습니다. Python programming FAQ (2.7이지만 모듈이 from module import function 양식을 사용하면 순환 가져 오기가 실패합니다.

1

"부트 스트래핑"은 "자신의 부트 스트랩으로 스스로 선택하는"문구를 말하며, 분명히 불가능합니다. 여기서는 wraps()를 사용할 수 없다는 것을 의미합니다.이 함수는 그 자체가 wraps() 정의의 일부이기 때문입니다.