gpt4 book ai didi

python - 方括号内加星号的表达式

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:49 26 4
gpt4 key购买 nike

似乎加星号的表达式不能像在括号内那样在方括号内使用:

>>> 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 版本中支持它?

最佳答案

至于如何做到这一点,答案可能是 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 | 的任何一个编号 |字符串+ | '...' | '无' | '真实' | '假').

这里有很多我没有经过的分支。对于其中的大多数,您只需查看规则的名称就可以理解其中的原因。另一方面,仔细检查可能并非没有用。

例如读取表达式test时:

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

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

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

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

最后,我们在这个过程中没有看到一个单一的前导 * 表达式,因此你的建议应该没有歧义(除非我错过了一个规则组合)。向实际从事此工作的人询问是否有充分的理由不存在这种外部潜在的语法歧义,这也许是有意义的。

关于python - 方括号内加星号的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com