2015-04-21 1 views
5

Si s est un objet slice dans le python, construit en utilisant soit s = slice(start, stop, step) ou (dans le contexte approprié) start:stop:step, les valeurs utilisées pour construire s sont disponibles à partir de l'objet lui-même comme slices.start, s.stop et s.step.Puis-je obtenir les valeurs utilisées pour construire une xrange Python 2.7 à partir de l'objet lui-même?

similaires start, stop et step membres sont disponibles sur range objets en Python 3.4 [Issue9896]. Par exemple, range(1, 4, 2).start == 1.

Cependant, les objets Python 2.7 xrange ne possèdent pas les membres start, stop et step. Existe-t-il un autre moyen d'obtenir les valeurs utilisées pour construire le xrange à partir de l'objet lui-même?

+0

Je ne pense pas. –

+0

Vous pouvez facilement obtenir des valeurs qui construiraient une plage équivalente, mais pas les arguments constructeurs réels utilisés. – user2357112

Répondre

3

Il est pas joli, mais vous pouvez analyser la représentation str du xrange

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

etc

Notez que le max ne peut pas être trouvé de manière fiable cette façon, s'il y a des étapes spécifiées dans la gamme. Par exemple, dans l'exemple ci-dessus, (1, 4, 2) devient (1, 5, 2) dans la représentation str.

4

Il est possible de récupérer les arguments d'origine start et step, mais pas toujours l'argument original stop.

Une façon vous pouvez obtenir les valeurs est de regarder le __reduce__ (ou __reduce_ex__) méthode de l'objet xrange (normalement utilisé pour le décapage):

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

Ensuite start, stop, step = y.__reduce__()[1] attribuerait les trois noms de variables à la entiers appropriés. Les valeurs start et step sont toujours les valeurs d'origine qui ont été utilisées pour construire l'objet xrange.

stop peut être plus élevé que l'argument utilisé à l'origine pour contracter l'objet. Pour tout xrange objet x il est égal à x[-1] + step.

En général, il n'est pas possible de récupérer l'argument d'arrêt d'origine une fois que l'objet xrange a été créé. Si vous étudiez le source for xrange, vous verrez que cet objet ne conserve pas de référence à une valeur d'arrêt particulière, seulement la valeur de départ, la valeur de pas et la longueur totale de l'itérateur. Lorsque str ou __reduce__ est appelé, l'objet calcule la dernière valeur d'arrêt possible avec la fonction interne get_stop_for_range.

Ceci est en contraste à l'objet de Python 3 range, qui ne se souviennent de la stop value originale.