You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.10类内有list方法时无法标注list类型参数的原因

自定义list方法导致类型标注报错的问题解答

问题代码

class Greetings:
    def list(self) -> list[str]:
        return ['ab', 'cd']

    def hello(self, names: list[str]) -> None:
        for name in names:
            print("Hello", name)

报错信息

... in Greetings
    def hello(self, names: list[str]) -> None:
E   TypeError: 'function' object is not subscriptable

原因解析

  • 这不是Python语言的问题,完全是作用域优先级导致的。在类定义内部,Python查找名称时会优先在类自身的作用域中查找。你自定义了名为list的实例方法,此时类作用域里的list指向的是这个方法(函数对象),而非内置的list类型。函数对象不支持[]下标操作,所以出现'function' object is not subscriptable的错误。

  • Python 3.10确实支持list[str]这种原生参数化类型标注(PEP 604),你的问题和这个特性无关,纯粹是自定义方法名与内置类型名冲突引发的。

解决方法

  • 推荐方案:修改自定义方法名
    给list方法改一个不与内置类型/关键字冲突的名字,比如get_greeting_names:

    class Greetings:
        def get_greeting_names(self) -> list[str]:
            return ['ab', 'cd']
    
        def hello(self, names: list[str]) -> None:
            for name in names:
                print("Hello", name)
    
  • 不推荐方案:明确引用内置list
    如果一定要保留list方法名,可以在类型标注里直接指定内置的list,比如使用__builtins__.list:

    class Greetings:
        def list(self) -> __builtins__.list[str]:
            return ['ab', 'cd']
    
        def hello(self, names: __builtins__.list[str]) -> None:
            for name in names:
                print("Hello", name)
    

    这种写法可读性差,容易引发其他混淆,不建议使用。

内容的提问来源于stack exchange,提问作者pakobill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:46:17