【问题标题】:Is there a reason why something like `list[]` raises `SyntaxError` in Python?像`list[]`这样的东西在Python中引发`SyntaxError`有什么原因吗?
【发布时间】:2021-09-20 16:29:53
【问题描述】:

假设我想实现我的自定义list 类,并且我想覆盖__getitem__ 以便可以使用默认None 初始化item 参数,并相应地执行:

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,所以我假设该语句在语法级别是非法的......我的问题是:为什么?会不会和其他一些说法有冲突?

我对此非常好奇,非常感谢愿意解释的人!

【问题讨论】:

    标签: python list syntax


    【解决方案1】:

    它在语法上没有用。没有一种有用的方法可以以编程方式使用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 + 是合法的。再一次,这在语法上没有用 - 如果你想这样做,你可以只公开一个函数。

    【讨论】:

    • 非常感谢您的解释;如果没有切实的好处,他们不会实施它是有道理的。另外,我发现添加专用属性是一个很好的解决方案,所以也感谢您添加它!
    【解决方案2】:

    __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
    

    注意错误信息中的“not tuple”。

    【讨论】:

    • 这与为什么指定 no 索引是语法错误无关
    • “总是只接受一个参数”,即不允许没有参数。这怎么不回答问题?
    • @Possseidon 实际上我并没有试图弄乱__getitem__ 签名,而只是设置一个默认值并使用“空”索引符号,就像调用函数时一样带空括号。
    • 我的意思是__getitem__ 是索引本身的同义词。抱歉,如果不清楚。索引本身总是只需要一个参数,我试图用这个例子来说明。
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 2019-11-16
    • 2021-11-05
    • 2020-10-24
    • 2011-06-02
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多