2015-03-02 4 views
-1

Очевидно, что Numpy предоставляет специальный синтаксис для своих списков. А именно, я прошел через обозначение myarray[:, 4]. Я попытался найти источник массива в Numpy, но не был успешным. (Я нашел только некоторые C .h заголовки и скомпилированную библиотеку.)Можно ли создавать собственные правила синтаксиса в Python?

Любая идея о том, как кто-то может создать свой собственный синтаксис?

+0

** Любой объект ** Python может поддерживать этот синтаксис, он не уникален для Numpy. Поддержка синтаксиса является частью Python. –

+0

Кстати, что означает ':' означает? – khajvah

+0

@khajvah Символ ':' - это только фрагментная нотация. –

ответ

1

Вот краткий демо с помощью кортежей поддельных многомерных индексов:

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

Прохождение в кортежах не использует ту же грамматику, что и расширенная нарезка. –

+0

Из [документации] (https://docs.python.org/2/reference/expressions.html#slicings): * В формальном синтаксисе существует двусмысленность: все, что похоже на список выражений, также выглядит как фрагмент список, поэтому любая подписка может быть интерпретирована как разрез.Вместо того, чтобы усложнять синтаксис, это неоднозначно, определяя, что в этом случае интерпретация как подписка имеет приоритет над интерпретацией как срез (это так, если список срезов не содержит правильного среза или эллипсов). * –

+0

Фактически это был самым интуитивным ответом, который заставил меня понять, что происходит. – Pithikos

0

NumPy использует только простой синтаксис питона с - предположительно - умными реализациями __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)) 
3

Синтаксисом является части языка Python , Slicing syntax поддерживает 1 или более ломтиков:

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, например. Таким образом, по сути, если у вас есть убедительный прецедент и достаточно большое сообщество, использующее этот язык, вы можете предложить новый синтаксис и добавить его к этому языку.

Смежные вопросы