我是 Python 开发新手,正在尝试解决问题。我正在使用 Pycharm 进行开发。我目前正在尝试注释变量的类型,以便通过自动完成和建议更轻松地访问。我尝试了代码的迭代,但结果不一。
这是有问题的代码:
path = os.path.dirname(os.path.realpath(__file__)) # type: str
components = path.split(os.sep) # type: list[str]
显示的第一个问题位于第二行类型注释的左大括号处。它说:
Class 'type' does not define '__getitem__', so the '[]' operator cannot be used on its instances.
我用谷歌搜索了一下,虽然问题似乎很清楚,但打开
list
类的代码清楚地显示了一个方法
__getitem__
:
class list(object):
"""
list() -> new empty list
list(iterable) -> new list initialized from iterable's items
"""
....
def __getitem__(self, y): # real signature unknown; restored from __doc__
""" x.__getitem__(y) <==> x[y] """
pass
好吧,也许这并不容易理解,而且有一些其他加载机制在工作。此外,“问题”似乎是我使用了
list[str]
而不是
List[str]
所以我改变了代码:
path = os.path.dirname(os.path.realpath(__file__)) # type: str
components = path.split(os.sep) # type: List[str]
现在一切都中断了:第二行现在抱怨这个:
Expected type 'List[str]', got 'List[str]' instead`
之前关于
__getitem__
的问题仍然存在。
有没有一种方法可以注释这些变量而不会给检查员?我对 Python 文档在这方面不太满意,没有明确说明其内置方法的返回类型。我必须依赖 Pycharm 在文档弹出窗口 (Ctrl+q) 中提供的信息。
遇到的问题与类型提示和 Python 版本的实现细节有关。以下是的问题的细分以及如何解决它们:
1.
type
中的错误:
__getitem__
list[str]
语法是在 Python 3.9 中引入的。如果使用的是早期版本,解释器不会将其识别为类型注释,而是尝试将其理解为对
type
对象(Python 中所有类型的元类)进行索引,从而导致错误。
2.
List[str]
错误:
Expected type 'List[str]', got 'List[str]' instead
这是 PyCharm 中的一个已知问题,有时类型检查器无法正确推断类型,即使它们是正确的。
解决方案
-
升级到 Python 3.9 或更高版本: 这将解决第一个问题,并允许使用
list[str]
语法进行类型注释,而无需导入List
。 -
使用
from typing import List
: 对于 Python 3.9 之前的版本,需要从此模块导入List
以进行类型提示。 -
忽略 PyCharm 的类型检查错误: 如果升级 Python 版本不是一个选项,并且确定自己的类型注释是正确的,则可以暂时忽略 PyCharm 的错误。可以通过在有问题的行上使用
# type: ignore
来禁止显示特定错误。
修改后的代码(适用于所有 Python 3.x 版本):
from typing import List
import os
path = os.path.dirname(os.path.realpath(__file__)) # type: str
components = path.split(os.sep) # type: List[str]
此代码应在所有受支持的 Python 3.x 版本中运行,并且 PyCharm 应该能够正确理解类型注释。
其他提示:
- 启用类型提示: 确保在 PyCharm 设置中启用了类型提示 (Settings/Preferences -> Editor -> Inspections -> Python -> Type hinting)。
-
安装类型提示存根:
对于没有类型提示的第三方库,可以安装类型提示存根包。这些软件包提供类型信息,可以帮助 PyCharm 进行类型检查和自动完成。可以使用
pip install mypy
安装 mypy,这是一个常用的类型检查器。
通过遵循这些步骤,应该能够在代码中使用类型注释,而不会遇到任何问题,并充分利用 PyCharm 的自动完成和建议功能。
标签:python,pycharm,python-typing,python-3.4 From: 58606569