8

Python (2.7.4) でスライスを使って遊んでいます:

class Foo():
    def __getitem__(self, key):
        # Single value
        if isinstance(key, (int,long)):
            return key

        # Slice
        if isinstance(key, slice):
            print 'key.start = 0x{0:X}   key.stop = 0x{1:X}'.format(key.start, key.stop)
            length = key.stop - key.start
            return str(length)

すべてが期待どおりに動作するようです:

>>> f = Foo()
>>>
>>> f[42]
42
>>>
>>> f[20:30]
key.start = 0x14   key.stop = 0x1E
'10'

ただし、スライス インデックスは 0x7FFFFFFF に制限されているようです。

>>> f[0xFEDCBA98 : 0xFFFFFFFF]
key.start = 0x7FFFFFFF   key.stop = 0x7FFFFFFF
'0'
>>> f[0x80000000:0x90000000]
key.start = 0x7FFFFFFF   key.stop = 0x7FFFFFFF
'0'

スライス インデックスが通常の値と同じlong整数昇格の対象にならないのはなぜですか? intこれに対する回避策はありますか?

4

2 に答える 2

7

これは古いスタイルのクラスの制限のように見えることに気付きました。新しいスタイルのクラス(から派生したものobject) は、期待どおりに動作します。

class Foo(object):
   #...

結果:

>>> f = Foo()
>>>
>>> f[0x80000000:0x90000000]
key.start = 0x80000000   key.stop = 0x90000000
'268435456'
>>>
>>> f[0xFEDCBA98 : 0x1200000000]
key.start = 0xFEDCBA98   key.stop = 0x1200000000
'73033532776'
>>>

私はこれがどこにも文書化されているのを見たことがありません。この制限はsliceクラス自体にはないため、特に混乱します。

>>> s = slice(0xFEDCBA98, 0x1200000000)
>>>
>>> s
slice(4275878552L, 77309411328L, None)
>>>
>>> hex(s.start)
'0xfedcba98L'
于 2013-10-31T02:28:09.553 に答える