导入错误:无法从'typing'中导入名称为'Literal'的模块

36

我最近开始使用PEP 484PEP 586来使我的代码更清晰、更易于理解。到目前为止一切都很好,但是当我想要使用typing包中的Literal时,似乎无法导入。

最令人惊讶的是,PyCharm并没有抱怨导入或使用它。

最终我想要使用的代码看起来像这样:

SomeVar = TypeVar("SomeVar", Literal['choice1'], Literal['choice2'], someType)

它将用于这样的情况:您可以使用字符串来描述您想要什么或已经有一个解决方案,例如:

def someFunc(my_var: SomeVar = 'choice1'):
    result = []
    if my_var == 'choice1':
        result.append(...)
    else:
        result = my_var
    return result

我使用带有Python 3.7.7的Anaconda环境。

2个回答

43

在Python 3.8及更高版本中使用Literal

from typing import Literal

在所有Python版本中使用Literal(1)

Literal 在3.8中被添加到 typing.py, 但您仍然可以在旧版本中使用 Literal

首先安装 typing_extensions (pip install typing_extensions) 然后:

from typing_extensions import Literal

这种方法也适用于Python 3.8及更高版本。

在所有Python版本(2)中使用Literal

为了完整起见,我还添加了try-except导入Literal的方法:

try:
    from typing import Literal
except ImportError:
    from typing_extensions import Literal

如果您使用的是Python 3.7或更早版本,则需要安装typing_extensions


29

如在文档中所述,typing.Literal 仅适用于 Python 3.8 及以上版本。


3
谢谢!那么你建议采取什么替代方案呢? - Kim Vallée
Anaconda仍未附带Python 3.8,但安装后可以将其更新为3.8。请参见例如此Stack Overflow问题 - jmd_dk
或者(如果你不想更新 Python 版本),你可以使用 typing-extensions 包中的 Literal 类型。 - Dan Oneață

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接