python中是否有内容以不同方式处理传递给__getitem_
_
的参数,并自动将start:stop:step
构造转换为切片?
以下是我的意思
class ExampleClass(object):
def __getitem__(self, *args):
return args
def __call__(self, *args):
return args
def randomMethod(self, *args):
return args
a = ExampleClass()
#this works
print a[3:7:2, 1:11:2]
#syntax error on the first colon
print a.randomMethod(3:7:2, 1:11:2)
print a(3:7:2, 1:11:2)
#these work
print a.randomMethod(slice(3,7,2), slice(1,11,2))
print a(slice(3,7,2), slice(1,11,2))
是否只是解释器在start:stop:step
内搜索[]
的实例,并将其换成slice(start, stop, step)
?文档只是说:
括号(下标)表示法在内部使用切片对象
这是我不能改变行为的python内部位吗?是否有可能使其他函数采用切片对象来使用start:stop:step
简写?*
*我已经看到了另一个问题,Can python's slice notation be used outside of brackets?,但这只是使用自定义类,我可以轻松做到。我想要的是一种只使用start:stop:step
而不必将其包装在其他任何东西中的方法。
侧面注意:
它也表明[...]
中的所有参数都打包成tuple
,有点像它正在做[*args]
- > __getitem__(args)
。
class ExampleClass2(object):
def __getitem__(self, arg):
return arg
def __call__(self, arg):
return arg
b = ExampleClass2()
print b["argument 1", 2:4:6,3] # ('argument 1', slice(2, 4, 6), 3)
print b(slice(3,7,2), slice(1,11,2)) # TypeError: __call__() takes exactly 2 arguments (3 given)
答案 0 :(得分:4)
Python语法定义何时可以使用切片运算符:
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
subscriptlist: subscript (',' subscript)* [',']
subscript: test | [test] ':' [test] [sliceop]
sliceop: ':' [test]
test
几乎是任何表达式,但只能在subscriptlist
内使用切片运算符。所以是的,用于下标的方括号是重要的,但是用于列表的方括号不会神奇地允许你写一个切片,也不能将切片放在任意表达式中碰巧在下标内。
如果您想要在不订阅内容时需要切片,则必须编写slice(a,b,c)
。
答案 1 :(得分:2)
np.lib.index_tricks
包含几个接受此::
输入的“功能”,例如np.mgrid
,np.r_
,np.s_
。
它们实际上是作为类的实例实现的,具有__getitem__
定义。并且用括号“召唤”它们。
np.s_[2::2] # slice(2, None, 2)
np.r_[-1:1:6j, [0]*3, 5, 6] # array([-1. , -0.6, -0.2, 0.2, ... 6. ])
mgrid[0:5,0:5]
我通常不会使用它们,但它们是__getitem__
如何被利用的有趣例子。
np.insert
是生成包含切片的索引元组的函数示例。 np.apply_along
也是:
i = zeros(nd, 'O')
...
i[axis] = slice(None, None)
...
i.put(indlist, ind)
...arr[tuple(i.tolist())]
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html 有相关说明:
请记住,切片元组始终可以构造为
obj
并在x[obj]
表示法中使用。可以在构造中使用切片对象代替[start:stop:step]
符号。例如,x[1:10:5,::-1]
也可以实现为obj = (slice(1,10,5), slice(None,None,-1)); x[obj]
。这对于构造适用于任意维数组的通用代码非常有用。