[英]python types: Literal of logging level as type?
以下代碼:
import logging
print(type(1))
print(type(logging.WARNING))
印刷:
<class 'int'>
<class 'int'>
然而,根據 mypy,此代碼片段的第一行是合法的,但第二行不是(變量“logging.WARNING”作為類型無效):
OneOrTwo = Literal[1,2] # ok
WarningOrError = Literal[logging.WARNING, logging.ERROR] # not ok
我不明白為什么 OneOrTwo 的定義沒問題,但 WarningOrError 卻不行。
我還想知道如何使用 WarningOrError 的合法等價物,即我可以這樣使用的東西:
def a(arg: WarningOrError)->None:
pass
注意:mypy 重定向到https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases ,但這並沒有為我澄清事情。
Literal
只接受文字 arguments。PEP586 在這種情況下對什么構成“文字”有非常嚴格的定義。 你可以在這里閱讀它。 您定義WarningOrError
的問題在於logging.ERROR
和WARNING
的實際定義使它們可變(您可以在此處查看logging
的源代碼),因此是非法文字。 另一方面,像1
或2
這樣的常量表達式可以靜態地知道(它們永遠不會改變。)因此是可接受的文字。
在公認的合法文字中, Enum
對象可以幫助您實現您想要的:
import logging
from typing import Literal
from enum import Enum
class Log(Enum):
ERROR = logging.ERROR
WARNING = logging.WARNING
LogType = Literal[Log.ERROR, Log.WARNING]
def a(arr: LogType):
pass
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.