2014-04-03 5 views
2

파일 객체가 해시 가능하고 파이썬 사전의 키에 사용될 수 있다는 것을 알았지 만 파일 객체가 해시되는 방식을 파악할 수 없습니다. 이것은 OS에 따라 inode 나 비슷한 것을 사용합니까?파이썬 파일 객체에서 __hash__은 무엇을합니까?

파이썬 2.7.6 소스를 살펴 보았지만 비어있었습니다. Object/fileobject.c에 tp_hash 함수 포인터가 NULL 인 것 같습니다. 그래서, 파일 객체가 피기 백킹하는 기본 해쉬 함수를 추측하고 있습니다. 이게 어떻게 작동하는지 알아?

필자는 파일 객체가 해시 가능하므로 dict 키로 사용할 수 있다고 가정합니다. 이것에 대한 어떤 단점도 내가 보지 못했을까요?

In [1]: x = open('test.txt', 'r') 

In [2]: x.__hash__ 
Out[2]: <method-wrapper '__hash__' of file object at 0x105760f60> 

In [4]: hash(x) 
Out[4]: 274161910 

답변

3

그들은하지 디스크상의 파일 자체의 기능에 의해, 객체 ID로 해시 :

다음은 'hashability'을 증명하는 예입니다.

>>> f1 = open('someFile', 'r') 
>>> f2 = open('someFile', 'r') 
>>> hash(f1) 
8702521 
>>> hash(f2) 
8702539 

당신은 DICT 키로 파일 객체를 사용하지만,이 객체 기반 해싱을 인식 할 수있다 : 각 파일 객체가 같은 파일을 참조하는 경우에도, 자신의 해시를 가지고있다. 해시는 개체의 실제 파일이나 내용이 아닌 고유 한 파일입니다.

즉, 파일 객체를 dict 키로 사용하는 경우를 생각해 보면 약간 어렵습니다. 파일이 열려 있으면 dict 키로 객체를 유지하면 파일을 열어두기 때문에 다른 프로그램에서 사용할 수 없게됩니다. 일반적으로 파일 객체를 사용하면 데이터를 가져 와서 파일을 닫는 즉시 파일은 외부 리소스이기 때문에 가능한 빨리 풀어 버리기를 원하기 때문에 실용적입니다.

+0

감사합니다. 그래서, 질문을 후속. 왜 객체 ID별로 '해시'를 나열하지 않습니까? 나는 좋은 생각이라고 말하는 것이 아니지만, 당신은 dict에서 목록을 키로 사용할 수 있습니다. 나는리스트가 변경 가능하다는 것을 안다.하지만 파일 객체가 아니다. 객체가 id를 가지고 있다고해도 객체가 해시 가능하다고 간주되는 이유에 대한 이해를 시도하는 것뿐입니다. –

+0

@ durden2.0 : 파일 객체는 변경할 수 있지만 변형하면 해시에 영향을주지 않습니다. 리스트가 id에 의해 해시 된 경우, 같지만 구별되는 목록 오브젝트는 해시가 동일하지 않습니다. 그래서 만약 당신이'x = [1, 2, 3]; 두 개의 [1, 2, 3]이 서로 다른 객체이기 때문에 (d [[1, 2, 3]] d [x] = 1 ' 그들은 같은 내용을 가지고 있지만). 이것은 목록에서 원하는 것이 아닙니다. 이에 대한 또 다른 질문이 있습니다. 일반적으로 객체 ID로 해싱하는 것에 대해 더 궁금한 점이있는 경우이 질문의 주제와 조금 다르기 때문에 별도로 질문해야합니다. – BrenBarn

+0

@ durden2.0 : 파일 객체를 자신과 동일하게 만들 수있는 방법은 없습니다. 동등성 테스트는 안정적입니다 (동일한 객체에 대해서만 true). 따라서 해시도 안정적으로 유지됩니다. –

3

__hash__object에서 상속되며 객체의 값 (예 : CPython의 메모리 주소)을 전적으로 기준으로합니다 (id()).

두 개의 file 개체가 동일하면 동일합니다 (예 : 사실 그들은 같은 대상입니다.

파일 개체에 대한 사용자 지정 일치 테스트는 없습니다. 이러한 평등은 파일 이름, 모드, 버퍼 상태 및 현재 파일 포인터를 고려해야한다. 평등 테스트가 없다면 해시 함수를 구현할 필요가 없습니다.

관련 문제