8.1 对象引用
我们已经见过链接是如何定位组内对象的。但是还有另一个机制也可以做到这一点。而且更强大的是,这种机制还可以作为数据保存在特征和数据集里面。
8.1.1 创建和解引用
让我们创建一个简单文件,它包含一些组和一个数据集:
在组grp1内,我们注意到有这样一个有意思的属性叫ref:
访问.ref返回的对象就是一个HDF5对象引用。所谓对象引用其实就是指向文件中对象的指针。你可以将其当作字典的键来“解引用”获得对象:
另外,如果你需要使用isinstance,这些对象的Python类型是h5py.Reference:
由于引用是一种定位对象的“绝对”方法,你可以在任意组而不仅是根组上解引用,得到的都是同一个对象:
但是记住它们只能定位本文件内的对象,若试图在另一个文件内解引用会失败:
8.1.2 引用是一种“永不失效”的链接
目前为止还看不出相比链接引用有什么改进。但其实两者有一个重要的区别:引用可以被保存为数据,而且对象重命名不会对引用造成影响。
这里有一个例子。假设我们需要在某个组上添加一个指向mydata数据集的特征。我们可以简单地在特征中保存对象的名字:
但如果我们重命名mydata数据集就会让链接失效:
相反,如果我们使用对象引用:
再次重命名数据集,引用依然有效:
提示
当你解引用一个对象时,HDF5有可能无法获取对象的名字。此时,obj.name将返回None。这个问题不再像以前那么严重了(HDF5 1.8在获取名字上相当在行),但如果获取的是None也不要惊慌失措。
8.1.3 引用是一种数据
引用也是HDF5承认的类型,你可以在特征和数据集里自由使用它们。当然,NumPy没有本地的引用类型,所以我们再一次请求special_dtype帮忙,这次要用到ref关键字:
一大堆元数据。但不要沮丧。它和变长字符串一样,是一个普通的对象dtype:
我们可以用这个dtype轻松创建类型为对象引用的数据集:
这个数据集里是什么?如果我们获取一个未初始化的元素,我们会得到一个null引用:
和C里的null指针一样,这个引用不指向任何东西。解一个null引用就跟在错误的文件内解引用一样,会导致ValueError:
有一种简单的方法可以在不捕捉异常的情况下检查一个引用是否为null,检查引用的真值:
提示
真值为True并不意味着该引用真的指向某个东西,只意味着它不是null。如果你创建了一个引用然后删除了对象,此时引用的真值为True,但尝试去解引用依然会得到一个ValueError。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论