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”缩写形式的切片对象?方括号(下标)表示法在内部使用切片对象
*我看到了另一个问题:能否在方括号之外使用Python的切片符号?,但那只是使用自定义类来完成,我也可以轻松地做到。我想要的是一种方法,可以直接使用“start:stop:step”,而无需将其包装在其他任何内容中。
附注:
还有一个看起来所有方括号“[]”内的参数都封装成元组,“[*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)
a.randomMethod([3:7:2], [1:11:2])
或者甚至a.randomMethod([3:7:2, 1:11:2])
可以工作...不过根据 Python 之禅的建议,我可能更喜欢显式地将切片对象slice(1,11,2)
传递给该方法,而不是利用一些奇怪的重载语法。 - Anentropic