ImportError: cannot import name 'Literal' from 'typing'
ImportError: cannot import name 'Literal' from 'typing'
我最近开始使用 PEP 484 and PEP 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
我使用 Anaconda 环境 Python 3.7.7.
如 docs 中所述,typing.Literal
仅适用于 Python 3.8 及更高版本。
在 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 版本中使用 Literal
(2)
为了完整起见,我还添加了 try-except 方法来导入 Literal
:
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
这应该也适用于所有 Python 版本,前提是如果您使用 Python 3.7 或更早版本,则安装了 typing_extensions
。
我最近开始使用 PEP 484 and PEP 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
我使用 Anaconda 环境 Python 3.7.7.
如 docs 中所述,typing.Literal
仅适用于 Python 3.8 及更高版本。
在 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 版本中使用 Literal
(2)
为了完整起见,我还添加了 try-except 方法来导入 Literal
:
try:
from typing import Literal
except ImportError:
from typing_extensions import Literal
这应该也适用于所有 Python 版本,前提是如果您使用 Python 3.7 或更早版本,则安装了 typing_extensions
。