返回介绍

8.1 对象引用

发布于 2024-01-25 22:02:55 字数 3275 浏览 0 评论 0 收藏 0

我们已经见过链接是如何定位组内对象的。但是还有另一个机制也可以做到这一点。而且更强大的是,这种机制还可以作为数据保存在特征和数据集里面。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文