像'list[]`这样的东西在Python中引发'SyntaxError'有什么原因吗?

2024-10-01 17:37:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想要实现我的自定义list类,并且我想要重写__getitem__,以便item参数可以用默认的None初始化,并相应地进行操作:

class CustomList(list):
    def __init__(self, iterable, default_index):
        self.default_index = default_index
        super().__init__(iterable)

    def __getitem__(self, item=None):
        if item is None:
            item = self._default_index
        return super().__getitem__(item)

iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
my_list = CustomList(iterable, 2)

这允许使用my_list[None],但是如果像my_list[]这样的东西固有地使用默认参数,那就太棒了

不幸的是,这引起了SyntaxError,因此我假设该语句在语法级别上是非法的……我的问题是:为什么?它会与其他一些说法相冲突吗

我对此很好奇,所以非常感谢所有愿意解释的人


Tags: selfnonedefault参数indexinitmydef
2条回答

它在语法上没有用处。在编程中使用my_list[]时,如果不进行硬编码,就没有一种有用的方法。一段代码有时不能在列表引用中包含变量,有时则不能。在这种情况下,为什么不使用另一个获取默认值的属性呢

@property
def default(self):
    return super().__getitem__(self.default)
@property.setter
def default(self, val):
    super().__setitem__(self.default, val)

object.__getitem__(self, val)被定义为具有必需的位置参数。Python是动态的,因此您可以不必更改该调用签名,但这不会改变所有其他代码使用它的方式

所有python操作符背后都有一个神奇的方法,这种神奇的方法总是可以比操作符公开更多的特性。为什么不让+有一个默认值?所以,a = b + 是合法的。再一次,这在语法上是没有用的——如果你想公开一个函数,你可以直接公开它

__getitem__始终只接受一个参数。可以传递多个参数,但这实际上只是将其转换为元组:

>>> a = []
>>> a[1, 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not tuple

注意错误消息中的“非元组”

相关问题 更多 >

    热门问题