5

sが(適切なコンテキストで) またはsliceを使用して構築された Python のオブジェクトである場合、構築に使用される値はオブジェクト自体から、およびとして利用できます。s = slice(start, stop, step)start:stop:stepsslices.starts.stops.step

Python 3.4 のオブジェクトでは、類似startstopおよびstepメンバーが使用できます[ Issue9896 ]。たとえば、.rangerange(1, 4, 2).start == 1

ただし、Python 2.7オブジェクトには,およびメンバーxrangeがありません。オブジェクト自体からの構築に使用される値を取得する他の方法はありますか?startstopstepxrange

4

2 に答える 2

4

start元のと引数を復元することは可能ですstepが、常に元のstop引数を復元できるとは限りません。

値を取得する 1 つの方法は、オブジェクトの__reduce__(または__reduce_ex__) メソッドを調べることですxrange(通常は酸洗に使用されます)。

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

次にstart, stop, step = y.__reduce__()[1]、3 つの変数名を適切な整数に割り当てます。startとのstep値は常に、xrangeオブジェクトの構築に使用された元の値です。

stopオブジェクトを縮小するために最初に使用された引数よりも高い可能性があります。任意のxrangeオブジェクトのx場合、 に等しくなりx[-1] + stepます。

xrange一般に、オブジェクトが作成されると、元の停止引数を回復することはできません。のソースをxrange調べると、このオブジェクトが特定の停止値への参照を保持していないことがわかります。開始値、ステップ値、および反復子の全体の長さのみが保持されています。strまたはが呼び出されると__reduce__、オブジェクトは内部関数 を使用して最新の可能なストップ値を計算しますget_stop_for_range

これは、元のstop 値を記憶する Python 3 のrangeオブジェクトと対照的です。

于 2015-04-21T09:35:30.793 に答える
3

きれいではありませんが、のstr表現を解析できますxrange

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

max範囲に指定されたステップがある場合、この方法では を確実に見つけることができないことに注意してください。たとえば、上の例では、が表現に(1, 4, 2)なります。(1, 5, 2)str

于 2015-04-21T09:24:32.867 に答える