切片投影¶
- JEP
10
- 作者
詹姆斯·萨耶维尼
- 状态
认可的
- 创建
2015年2月8日
摘要¶
本文建议修改切片表达式的语义以创建投影,这将带来与通配符、展平和过滤投影的一致性。
动机¶
jep5引入了切片表达式。这将python切片语义添加到JSON中。切片不会生成投影,因此下面这样的表达式将始终返回 null
: myarray[: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]
相反。