2015-04-21 33 views
5

Jeśli s jest slice obiekt w Pythonie wykonana przy użyciu s = slice(start, stop, step) lub (w przypadku odpowiedniego kontekstu) start:stop:step wartości używane do konstruowania s dostępne samego obiektu jako s.start, s.stop i s.stepslice są.Czy mogę uzyskać wartości użyte do skonstruowania Pythona 2.7 xrange z samego obiektu?

Podobne start, stop i step członkowie są dostępne na range obiektów w Pythonie 3.4 [Issue9896]. Na przykład range(1, 4, 2).start == 1.

Jednak obiekty Python 2.7 xrange nie mają członów start, i step. Czy istnieje inny sposób uzyskania wartości użytych do skonstruowania obiektu xrange z samego obiektu?

+0

Nie sądzę. –

+0

Możesz dość łatwo uzyskać wartości, które skonstruowałyby równoważny zakres, ale nie rzeczywiste używane argumenty konstruktora. – user2357112

Odpowiedz

3

To nie jest ładna, ale można analizować reprezentację str z xrange

>>> rr = xrange(1, 4, 2) 
>>> str(rr) 
'xrange(1, 5, 2)' 
>>> start = str(rr).split('(')[1].split(',')[0] 
>>> start 
1 

etc

nocie że max nie można wiarygodnie została znaleziona w ten sposób, jeśli są kroki określone w tym zakresie. Na przykład w powyższym przykładzie (1, 4, 2) staje się (1, 5, 2) w reprezentacji str.

4

Możliwe jest odzyskanie oryginalnych argumentów start i step, ale nie zawsze jest to oryginalny argument stop.

Jeden sposób można uzyskać wartości jest spojrzenie na metody __reduce__ (lub __reduce_ex__) obiektu xrange (zwykle używany do trawienia):

>>> x = xrange(10) 
>>> x.__reduce__()[1] 
(0, 10, 1) 
>>> y = xrange(2, 100, 13) 
>>> y.__reduce__()[1] 
(2, 106, 13) 

Następnie start, stop, step = y.__reduce__()[1] byłoby przypisać trzy nazwy zmiennych do odpowiednie liczby całkowite. Wartości start i step są zawsze oryginalnymi wartościami, które zostały użyte do skonstruowania obiektu.

stop może być wyższa niż argument używany pierwotnie do kontraktowania obiektu. Dla dowolnego obiektu xrangex jest równy x[-1] + step.

Zasadniczo nie jest możliwe odzyskanie oryginalnego argumentu zatrzymania po utworzeniu obiektu xrange. Jeśli będziesz studiować source for xrange, zobaczysz, że ten obiekt nie zachowuje odniesienia do konkretnej wartości zatrzymania, tylko wartość początkową, wartość kroku i całkowitą długość iteratora. Po wywołaniu str lub __reduce__ obiekt obliczy ostatnią możliwą wartość zatrzymania za pomocą funkcji wewnętrznej get_stop_for_range.

Jest to przeciwieństwo obiektu range z Python 3, który ma zapamiętać oryginalny stop value.