方括号内的加星标表达式

问题描述 投票:4回答:1

似乎星号表达式不能在方括号内使用它们在括号内的方式:

>>> import numpy as np
>>> x = np.ones((3, 4))
>>> x[:, *(None, None), :]
  File "<stdin>", line 1
    x[:, *(None, None), :]
         ^
SyntaxError: invalid syntax

虽然人们会期望后者输出相同的

>>> x[(slice(None), *(None, None), slice(None))]
array([[[[ 1.,  1.,  1.,  1.]]],


       [[[ 1.,  1.,  1.,  1.]]],


       [[[ 1.,  1.,  1.,  1.]]]])

你知道为什么不允许这样做有什么好的理由,以及是否有计划在下一个Python版本中支持它?

python numpy syntax
1个回答
3
投票

至于如何做到这一点,答案可能是x[:, None, None, :]。但也许你有一个包含nones = (None, None)的元组,在这种情况下你可以这样做:x[:, nones[0], nones[1], :]。但我同意将x[:, *nones, :]有效会更好。

关于这个问题,为什么不可能,我们可以看看Python grammar,看看为什么这不起作用:

trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
subscriptlist: subscript (',' subscript)* [',']
subscript: test | [test] ':' [test] [sliceop]
sliceop: ':' [test]

如果你从test跟随最长和最有前途的语法分支,搜索'*'文字(我不提供整个子树,因为大多数其他分支很早就停止了):test -> or_test -> and_test -> comparison -> xor_expr -> and_expr -> shift_expr -> arith_expr

请注意,我们要搜索的规则就是这个规则

star_expr: '*' expr

让我们看看我们是否可以从这里找到它(arith_expr):

arith_expr: term (('+'|'-') term)*
term: factor (('*'|'@'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power
power: atom_expr ['**' factor]
atom_expr: ['await'] atom trailer*

请记住,trailer是我们开始的地方,所以我们已经知道没有什么可以导致star_expr在这里,并且atom关闭所有这些不同的路径:

atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [testlist_comp] ']' |
       '{' [dictorsetmaker] '}' |
       NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')

基本上你应该被允许使用我们在分支(subscriptlist)或test -> ... -> arith_expr -> ... -> atom中的任何一个表达式中使用的任何表达式作为NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False'

我在这里没有经过很多分支机构。对于他们中的大多数人来说,只要查看规则的名称就可以理解为什么。另一方面,仔细检查也许没用。

例如,当阅读表达式test时:

test: or_test ['if' or_test 'else' test] | lambdef

我们可以看到['if' or_test 'else' test]关闭了路径(因为我们正在寻找* something)。另一方面,我可以包括lambdef,因为这对我们的任务完全有效,我只是忽略了这些路径,因为它们在我们探索它们之后立即关闭(应用单个规则invalidades *...),在这种情况下(因为你可能已经猜到了) ):

lambdef: 'lambda' [varargslist] ':' test

我们在这里看到一个'lambda',它不是一个以'*'开头的表达式,所以路径关闭了。有趣的是,这意味着x[lambda e: e]是完全有效的语法(我不会猜到,我从来没有看到它,但它是有道理的)。

最后,我们没有在这个过程中看到一个领先的*表达,因此你的建议不应该含糊不清(除非我错过了一个规则组合)。也许有意义的是,向那些真正参与过这项工作的人询问是否有充分理由不具备这种外部潜在的语法模糊性。

© www.soinside.com 2019 - 2024. All rights reserved.