簡體   English   中英

python 類型:記錄級別的文字作為類型?

[英]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.ERRORWARNING的實際定義使它們可變(您可以在此處查看logging的源代碼),因此是非法文字。 另一方面,像12這樣的常量表達式可以靜態地知道(它們永遠不會改變。)因此是可接受的文字。

在公認的合法文字中, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM