2015-04-21 10 views
5

s Wenn ein in Python slice Objekt ist, konstruiert entweder s = slice(start, stop, step) oder (in dem entsprechenden Kontext) start:stop:step verwenden, verwendeten die Werte s sind aus dem Objekt selbst als slices.start, s.stop und s.step Verfügung zu konstruieren.Kann ich die Werte, die verwendet werden, um einen Python 2.7 xrange aus dem Objekt selbst zu erstellen?

ähnliche start, stop und step Mitglieder sind auf range Objekte in Python 3.4 [Issue9896]. Zum Beispiel range(1, 4, 2).start == 1.

jedoch Python 2.7 xrange Objekte haben nicht die start, stop und step Mitglieder. Gibt es eine andere Möglichkeit, um die Werte zu erhalten, die zum Erstellen des xrange aus dem Objekt selbst verwendet werden?

+0

Ich glaube nicht. –

+0

Sie können ziemlich einfach Werte erhalten, die einen äquivalenten Bereich konstruieren, aber nicht die tatsächlichen Konstruktorargumente, die verwendet werden. – user2357112

Antwort

3

Es ist nicht schön, aber man konnte die str Darstellung des xrange

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

etc

Hinweis analysieren, dass die max nicht zuverlässig auf diese Weise gefunden werden kann, wenn es Schritte in dem angegebenen Bereich liegen. Zum Beispiel wird in dem obigen Beispiel (1, 4, 2)(1, 5, 2) in der str Darstellung.

4

Es ist möglich, die ursprünglichen Argumente start und step wiederherzustellen, aber nicht immer das ursprüngliche Argument stop.

Eine Möglichkeit, die Werte erhalten können, ist am __reduce__ (oder __reduce_ex__) -Methode des xrange Objekt suchen (normalerweise zum Beizen verwendet):

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

Dann start, stop, step = y.__reduce__()[1] die drei Variablennamen der zuweisen würde entsprechende ganze Zahlen. Die start und step Werte sind immer die ursprünglichen Werte, die zum Erstellen des xrange Objekts verwendet wurden.

stop möglicherweise höher als das ursprünglich zum Kontrahieren des Objekts verwendete Argument. Für jedes xrange Objekt x ist es gleich x[-1] + step.

Im Allgemeinen ist es nicht möglich, das ursprüngliche Stoppargument wiederherzustellen, nachdem das Objekt xrange erstellt wurde. Wenn Sie die source for xrange untersuchen, sehen Sie, dass dieses Objekt keinen Verweis auf einen bestimmten Stoppwert enthält, sondern nur den Startwert, den Schrittwert und die Gesamtlänge des Iterators. Wenn str oder __reduce__ aufgerufen wird, berechnet das Objekt den spätest möglichen Stoppwert mit der internen Funktion get_stop_for_range. Diese

steht im Gegensatz zu Python 3 der range Objekt, das hat die ursprünglichen stop value erinnern.