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
相关产品推荐
相关产品推荐

