gpt4 book ai didi

Python 切片对象和 __getitem__

转载 作者:太空狗 更新时间:2023-10-30 00:55:33 26 4
gpt4 key购买 nike

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,步骤)?文档简单地说:

The bracket (subscript) notation uses slice objects internally

这是我无法改变其行为的 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)

最佳答案

Python 语法定义了何时可以使用切片运算符:

trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
subscriptlist: subscript (',' subscript)* [',']
subscript: test | [test] ':' [test] [sliceop]
sliceop: ':' [test]

test 几乎可以是任何表达式,但它只能在 subscriptlist 中使用切片运算符。所以,是的,方括号用于下标很重要,但是用于列表的方括号不会神奇地让你写一个切片,你也不能把一个切片放在一个任意表达式中恰好在下标内。

如果您在不订阅某些内容时想要切片,则必须编写 slice(a,b,c)

关于Python 切片对象和 __getitem__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27229218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com