Python文件对象上__hash__有什么作用?

时间:2014-04-03 19:20:26

标签: python

我注意到文件对象是可以清除的,可以用于Python字典中的键,但我似乎无法弄清楚文件对象是如何被散列的。这只是根据操作系统使用inode或类似的东西吗?

我试图查看Python 2.7.6源代码,但是空洞了。对于tp_hash函数指针,Objects / fileobject.c看起来像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

2 个答案:

答案 0 :(得分:3)

它们被对象id散列,而不是磁盘文件本身的任何功能。每个文件对象都有自己的哈希值,即使它们引用相同的文件:

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

您可以将文件对象用作dict键,但要注意这种基于对象的散列。散列对于文件 object 是唯一的,而不是实际文件或其内容。

也就是说,考虑使用文件对象作为dict键的用例有点困难。如果文件是打开的,将对象保持为dict键将使文件保持打开状态,这可能会阻止其他程序使用它等。通常,对于文件对象,您希望将数据输出并尽快关闭文件是实用的,因为文件是外部资源,你想尽快释放它们。

答案 1 :(得分:3)

__hash__继承自object,完全基于对象的id()值(例如CPython中的内存地址)。

那是因为两个file个对象只有相同才对,例如如果他们实际上是同一个对象。

文件对象没有自定义相等性测试;这种相等性必须考虑文件名,模式,缓冲区状态和当前文件指针(如果曾经实现过)。没有相等测试,实现哈希函数也没有意义。