2015-04-21 24 views
5

Se s è un oggetto slice in Python, costruiti utilizzando s = slice(start, stop, step) o (nel contesto appropriato) start:stop:step, i valori utilizzati per costruire s sono disponibili dall'oggetto slice stesso come s.start, s.stop e s.step.Posso ottenere i valori usati per costruire un xrif di Python 2.7 dall'oggetto stesso?

simili start, stop e step membri sono disponibili su range oggetti in Python 3.4 [Issue9896]. Ad esempio, range(1, 4, 2).start == 1.

Tuttavia, Python 2.7 xrange oggetti non hanno i membri start, stop e step. C'è un altro modo per ottenere i valori utilizzati per costruire il xrange dall'oggetto stesso?

+0

Io non la penso così. –

+0

È possibile ottenere facilmente valori che dovrebbero costruire un intervallo equivalente, ma non gli argomenti effettivi del costruttore utilizzati. – user2357112

risposta

3

Non è bello, ma è in grado di analizzare la str rappresentazione del xrange

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

ecc

Si noti che il max non può attendibilmente essere trovato in questo modo se ci sono passi specificati nella gamma. Ad esempio, nell'esempio sopra, (1, 4, 2) diventa (1, 5, 2) nella rappresentazione str.

4

È possibile recuperare gli argomenti originali start e step, ma non sempre l'argomento originale stop.

Un modo è possibile ottenere i valori è quello di esaminare il metodo __reduce__ (o __reduce_ex__) dell'oggetto xrange (normalmente usato per il decapaggio):

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

Poi start, stop, step = y.__reduce__()[1] sarebbe assegnare i tre nomi delle variabili al interi appropriati. I valori start e step sono sempre i valori originali utilizzati per costruire l'oggetto xrange.

stop potrebbe essere più alto dell'argomento originariamente utilizzato per contrarre l'oggetto. Per qualsiasi oggetto xrangex è uguale a x[-1] + step.

In generale, non è possibile ripristinare l'argomento stop originale una volta creato l'oggetto xrange. Se studi lo source for xrange, vedrai che questo oggetto non conserva un riferimento a un valore di arresto particolare, solo il valore iniziale, il valore del passo e la lunghezza complessiva dell'iteratore. Quando si chiama str o __reduce__, l'oggetto calcolerà l'ultimo valore di arresto possibile con la funzione interna get_stop_for_range.

Questo è in contrasto con Python 3 di range oggetto, che fa ricorda l'originale stop value.