Python 切片生成中给定的元组的元组
我有以下代码:Python 切片生成中给定的元组的元组,python,python-2.7,slice,argument-unpacking,Python,Python 2.7,Slice,Argument Unpacking,我有以下代码: class Foo(object): def __getitem__(self, *args): print len(args), type(args) print args 这将args作为元组提供: >>> x[1:] 1 <type 'tuple'> (slice(1, None, None),) >x[1:] 1. (切片(1,无,无),) 但这将args作为元组的元组: >>>
class Foo(object):
def __getitem__(self, *args):
print len(args), type(args)
print args
这将args
作为元组提供:
>>> x[1:]
1 <type 'tuple'>
(slice(1, None, None),)
>x[1:]
1.
(切片(1,无,无),)
但这将args作为元组的元组:
>>> x[1:,2:,3:]
1 <type 'tuple'>
((slice(1, None, None), slice(2, None, None), slice(3, None, None)),)
>x[1:,2:,3:]
1.
((切片(1,无,无),切片(2,无,无),切片(3,无,无)),)
为什么会这样?我希望最后一个示例会给我一个包含三个切片元素的元组。
\uuu getitem\uuu
的函数签名是:
def __getitem__(self, key):
# ... etc.
每当您对对象执行项访问时,一个参数键
将传递给\uuu getitem\uuuu
(与通常的impledself
一起)。即使你写了这样的东西,情况也是如此:
obj[a,b,c]
上述操作将导致将单个元组(a、b、c)
作为键
参数传递到\uu getitem\uuuu()
–它不会导致传递三个参数a
、b
和c
因为一个键
参数总是传递给\uuuuuu getitem\uuuuuu
,所以在格式错误的函数签名\uuuuuu getitem\uuuuuuuuu(self,*args)
中,args
将始终是一个仅包含一个项(键)的元组
在第一种情况下,由于使用了切片语法,因此该键是一个切片:
|<- slice object ->|
(slice(1, None, None),)
|<----- 1-tuple ----->|
如果将\uuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuu签名更改为传统的\uuuuu getitem\uuuuuuuuuuuuu(self,key)
表单,您将收到第二个示例所需的三个切片对象的元组
|<- slice object ->| |<- slice object ->| |<- slice object ->|
|<-------------------------- 3-tuple --------------------------->|
((slice(1, None, None), slice(2, None, None), slice(3, None, None)),)
|<--------------------------- 1-tuple ----------------------------->|