2013-05-26 24 views
14

Numpy.r_, .c_ i .s_ są jedynymi dostępnymi funkcjami Pythona, które pobierają argumenty w nawiasach kwadratowych zamiast nawiasach. Dlaczego tak jest? Czy jest coś wyjątkowego w tych funkcjach? Czy mogę tworzyć własne funkcje, które używają nawiasów (nie to, co chcę, po prostu ciekawi)?Dlaczego numpy.r_ zamiast nawiasów używa nawiasów?

Na przykład właściwa składnia jest następująca:

np.r_['0,2', [1,2,3], [4,5,6]] 

spodziewałem się, że będzie:

np.r_('0,2', [1,2,3], [4,5,6]) 

Odpowiedz

15

Każda klasa Pythona mogą być wykonane tak, aby jego instancje przyjąć jedną lub obie zapis: zaakceptuje parens, implementując funkcję o nazwie __call__, i nawiasy, wprowadzając __getitem__.

np.r_ jest klasą, która implementuje __getitem__ do robienia rzeczy bardziej wyszukanych niż zwykle. Oznacza to, że klasa r_ (tzw np.lib.index_tricks.RClass) robi coś takiego:

class RClass: 
    def __getitem__(self, item): 
     # r_ fancyness 

Prawdopodobnie stało się to tak, że może skorzystać z notacji slice - na przykład gdy masz listę (lub NP tablica lub każdy inny przedmiot wdrażania niniejszego protokołu) l i zrobić:

l[:5] 

, Python automatycznie tworzy slice obiekt do przekazania do __getitem__.

Ta składnia nie wymaga pracy z __call__ - użytkownik musiałby jawnie utworzyć plaster, wykonując l(slice(5)).

Pamiętaj, że może przyjmować dowolne argumenty; podczas gdy __getitem__ zawsze przyjmuje dokładnie jeden argument: kiedy robisz coś takiego jak my_array[1:3, 2:5], Python przekazuje pojedynczą krotkę . Ale, jak widzisz z r_, zawartość nie jest ograniczona do liczb i plasterków - podobnie jak każda inna funkcja, Python z przyjemnością przekaże dowolny obiekt i pozostawi go klasie, aby dowiedzieć się, co to znaczy.

+0

Dzięki! Nie przyszło mi do głowy, że to tylko standardowa składnia. – kdamica

+0

Nie rozumiem jednak celu, ponieważ plasterki znajdują się w podanych tablicach. Ponadto, jeśli jest to korzystne, dlaczego nie widzimy tego częściej? – kdamica

+0

@ KennethD'Amica Musiałbyś przekazać w 'slice (start, stop, step)' do wywołania funkcji jako jedyną alternatywę. "__getitem__" to jedyny sposób, aby to osiągnąć, to ** nie ** jest zaletą, jest to dość hackowaty sposób na zrobienie tego, ale został zbudowany tylko dla wygody i jest naprawdę potrzebny tylko podczas testowania kodu – jamylak

Powiązane problemy