Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 切片生成中给定的元组的元组_Python_Python 2.7_Slice_Argument Unpacking - Fatal编程技术网

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
(与通常的impled
self
一起)。即使你写了这样的东西,情况也是如此:

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 ----------------------------->|