2014-10-28 3 views
1
def funcA(x): 
    return x 

funcA.__code__.__hash__()funcA 여부를 확인하기위한 적절한 방법인가를 해싱?가 변경되었습니다 파이썬 함수

funcA.__hash__()id(funcA)/16과 동일하게 작동하지 않습니다. 나는 점검했다. 그리고 이것은 __code__.__hash__()를 위해 사실이 아니다. 또한 ipython 터미널에서 동작을 테스트 한 결과로 보였다. 그러나 이것이 보장 되는가?

나는 동일한 기능의 새 버전으로 기능의 이전 버전을 비교하는 방법을 가지고 싶습니다.

디스크 기반/장기 캐시 용으로 데코레이터 을 만들려고합니다. 따라서 함수가 변경되었는지 확인하는 방법이 필요합니다. 또한 콜 그래프를보고 호출 된 함수가 변경되지 않았는지 확인해야하지만 이는이 질문의 일부가 아닙니다.

요구 사항 :

    여러 통화 및 기계 이상 안정 필요
  • . 1은 파이썬 3.3에서 새로운 인스턴스의 시작마다 hash()이 랜덤 화된다고 말합니다. "해시 무인화가 기본값에 의해 사용 중지되었습니다"라고도 말합니다. 이상적으로, 무작위 화가 가능하더라도 안정적인 기능을 원합니다.
  • 이상적으로는 def funcA: passdef funcB: pass에 대해 동일한 해시를 산출합니다. 즉, 함수 이름 만 변경 될 때입니다. 아마도 필요하지 않습니다.
  • 가 난 단지 파이썬 3. 신경

하나의 대안은 주어진 함수를 포함하는 파일 내의 텍스트를 해시하는 것입니다.

+1

아마도 'pickle'과 같은 것이 더 유용할까요? –

+0

피클은 어떻게 더 유용할까요? 나는 그 기능을 피클해야합니까? – Unapiedra

+0

"함수 (내장 및 사용자 정의)는 값이 아닌"정규화 된 "이름 참조에 의해 절취됩니다. 즉 함수가 정의 된 모듈의 이름과 함께 함수 이름 만 절인됩니다. 함수의 코드도 함수 속성도 절대로 절식되지 않습니다. " 피클에 관한 파이썬 문서에서. – Unapiedra

답변

0
  1. 그래, 은 코드의 특정 기능에 고유 한 것으로 보입니다. 이것이 구현 된 곳이나 __code__.__hash__()이 정의 된 곳을 찾을 수 없습니다.

  2. co_code에 바이트 코드가 포함되어 있기 때문에 func_a.__code__.co_code.__hash__()을 사용하는 것이 가장 좋은 방법입니다. 이 경우 함수 이름은 해시의 일부가 아니며 코드가 동일한 두 개의 함수 (예 : func_afunc_b)는 동일한 해시를 갖습니다.

Source

hash(func_a.__code__.co_code) 
.