切片投影

JEP

10

作者

詹姆斯·萨耶维尼

状态

认可的

创建

2015年2月8日

摘要

本文建议修改切片表达式的语义以创建投影,这将带来与通配符、展平和过滤投影的一致性。

动机

jep5引入了切片表达式。这将python切片语义添加到JSON中。切片不会生成投影,因此下面这样的表达式将始终返回 nullmyarray[:10].foo.bar .

如果你想访问 foo.bar 对于当前必须写入的数组切片中的每个元素 myarray[:10][*].foo.bar .

这个JEP建议切片表达式将创建一个投影。

理论基础

对这个JEP的一个合理的反对意见是,这是不必要的,因为正如上面的示例所示,您可以获取任何切片并通过 [*] . 这是完全正确的,与其他JEP不同,这个JEP不支持以前不可能的任何行为。

相反,这种JEP的主要原因是为了一致性。现在有三种类型的阵列投影:

  • 列出投影 (foo[*].bar

  • 过滤投影 (foo[?a==b].bar

  • 展平投影 (foo[].bar

注意一般形式, foo[<stuff here>].<child-expr> . 每个现有的数组投影都具有相同的通用语义:

  • 取左手边,这是一个列表,并生成另一个列表作为对左手边求值的结果。这个新生成的列表将包含原始输入的元素(或者在展平投影的情况下包含原始输入元素的元素)。

  • 根据对左手边求值产生的列表中的每个元素计算右手边。

因此,通常,左侧负责创建新列表,但不负责操作列表中的单个元素。右侧用于操作列表中的单个元素。在列表投影的情况下,将使用原始列表中的每个元素。在过滤器投影的情况下,只有匹配表达式的元素传递到右侧。对于扁平投影,在将表达式传递到右侧之前,将合并子数组。

这是一个合理的预期,切片表现相似。毕竟,切片获取一个数组并生成一个子数组。在很多方面,它非常类似于过滤投影。虽然过滤投影只包含与特定表达式匹配的元素,但是切片投影只包含来自特定索引和指向特定索引的元素。考虑到它的语义非常接近过滤器投影,切片应该创建一致的投影。

规范

创建切片后,将创建投影。这将是JMESPath中第四种类型的数组投影。除了现有的阵列投影:

  • 列出投影

  • 展平投影

  • 过滤投影

将添加一个新的投影类型,即切片投影。切片投影的计算方法与其他阵列投影类似。给定一个切片投影,它包含一个包含切片表达式的左手边和一个右手边,切片表达式将被求值以创建一个新的子数组,右手边的每个表达式都将针对数组切片中的每个元素进行求值,以创建最终结果。

此JEP不包括对JMESPath语法的任何修改。

影响

对slices现有用户的影响最小。考虑:

  • 现有表达式,如 foo[:10].bar 正在返回 null . 现在他们不会回来了 null 价值观。

  • 对现有用户的唯一影响是,如果有人使用诸如 foo[:10][0] ,它现在将创建一个包含每个子列表中第0个元素的列表。在这个JEP之前,这个表达式等价于 foo[0] 切片是不必要的。任何拥有类似表达式的用户现在都可以使用 foo[0] 相反。

目录