导入错误:无法从“输入”中导入名称“文字”

Eti*_*win 3 python python-import python-3.7

我最近开始使用PEP 484PEP 586使我的代码更清晰,更易于访问。到目前为止一切正常,但是当我想Literal从包中使用时,typing它似乎无法导入。最令人惊讶的是,PyCharm 根本没有抱怨导入或使用它。

我最终想使用的代码如下所示:

SomeVar = TypeVar("SomeVar", Literal['choice1'], Literal['choice2'], someType)
Run Code Online (Sandbox Code Playgroud)

在您可以使用字符串来描述您想要的内容或已经制定的解决方案的情况下,将使用它,例如:

def someFunc(my_var: SomeVar = 'choice1'):
    result = []
    if my_var == 'choice1':
        result.append(...)
    else:
        result = my_var
    return result
Run Code Online (Sandbox Code Playgroud)

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

jmd*_*_dk 10

文档中所述,typing.Literal仅适用于 Python 3.8 及更高版本。

  • 谢谢 !那么你有什么建议呢? (2认同)

Ken*_*HBS 6

使用Literal在Python 3.8和更高版本

from typing import Literal
Run Code Online (Sandbox Code Playgroud)

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

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

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

from typing_extensions import Literal
Run Code Online (Sandbox Code Playgroud)

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

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

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

try:
    from typing import Literal
except ImportError:
    from typing_extensions import Literal
Run Code Online (Sandbox Code Playgroud)

这也适用于所有 Python 版本,因为typing_extensions如果您使用的是 Python 3.7 或更早版本,则已安装。