是否可以在Python中制作自己的语法规则?

时间:2015-03-02 10:25:54

标签: python syntax

显然Numpy为其列表提供了特殊的语法。也就是说,我的符号是myarray[:, 4]。我尝试在Numpy中找到数组的来源,但没有成功。 (我只找到了一些C .h标题和一个编译过的库。)

有关某人如何制作自己的语法的想法吗?

3 个答案:

答案 0 :(得分:3)

语法是 Python语言的一部分Slicing syntax支持一个或多个切片:

extended_slicing ::=  primary "[" slice_list "]"
slice_list       ::=  slice_item ("," slice_item)* [","]
     

[...]如果切片列表包含至少一个逗号,则该键是包含切片项转换的元组;否则,单个切片项的转换是关键。

Numpy利用了这个功能;您需要做的就是实现object.__getitem__() special method并处理slice()个对象的元组。

现在,Numpy项目在要求实现这一目标方面发挥了重要作用;这同样适用于...语法和Ellipsis对象的使用,以及numeric method hooks上的限制。

例如,新的dedicated @ and @= syntax也是Numpy社区特别要求的。所以从本质上讲,如果你有一个引人注目的用例和使用该语言的足够大的社区,你可以提出新的语法,并将其添加到语言中。

答案 1 :(得分:1)

这是一个使用元组伪造多维索引的简短演示:

>>> a={(1,2):'hi', (3,4):'there'}
>>> a[1,2]; a[3,4]
'hi'
'there'

答案 2 :(得分:0)

numpy只使用普通的python语法 - 大概是 - __getitem____setitem__的智能实现(参见python docs)。

您可以通过实施自己的__getitem__方法轻松使用此表示法:

class Object(object):
    def __getitem__(self, item):
        print item

看看它在做什么:

>>> o = Object()
>>> o[:,1:2]
(slice(None, None, None), slice(1, 2, None))