簡體   English   中英

用裝飾器檢查mypy類型

[英]mypy type checking with decorators

我有以下內容:

在myfile.py中:

from file1 import REQ
@has_request_variable
def fun(request, REQ(validator=check_int))
   /* body */

在file1.py中

class REQ(object):
    def __init__(self, validator=None):
        self.validator = validator

def has_request_variables(view_func):
       /* body */
       # Below I am calling the validator function to check
       error = param.validator(var_name, val)

現在我想使用mypy注釋有趣的函數,我已經按照以下方式完成了工作,但它並不理想,因為在有趣的情況下,我知道message是int類型的,因此我們應該使用int之類的注釋該參數。如何使用mypy實現它。

from file1 import REQ
@has_request_variable
def fun(request, message=REQ(validator=check_int))
    # type(Any, REQ) -> Any
    msg = message # type: int
   /* body */

首先,mypy與類型注釋不直接相關。 您可以在不注釋代碼的情況下使用mypy,因為mypy是一個使用類型推斷(和類型注釋(如果存在))對代碼進行類型檢查的程序。 另外,您可以在沒有mypy的情況下使用類型注釋-用於許多有用的目的,例如文檔,代碼可讀性等。

其次,mypy是靜態類型檢查器。 由於檢查了類型,因此沒有運行您的程序,因此沒有必要嘗試使用mypy進行運行時類型檢查(這有點像我在問題代碼中看到的那樣)。

因此,如果要進行靜態類型檢查,請使用批注 但是,如果您想在運行時進行類型檢查,則可以使用例如assertions 或者您可以同時使用它們...

類型注釋(用於使用mypy進行靜態類型檢查):

根據PEP ,類型注釋使您可以從以下代碼中刪除:

def print_many(what, how_many=10):
    long_what = how_many * what
    print(long_what)

為此,您在其中具有函數參數,返回類型以及帶注釋的任何局部變量:

def print_many(what: str, how_many: int=10) -> None:
    long_what = how_many * what # type: str
    print(long_what)

對於您的特定用例,如果您知道message的類型為int ,則: def fun(request, message: int)將完成此工作。

您可以在帶注釋的代碼上運行mypy並獲取結果,但是您的代碼將僅經過類型檢查,而不會執行。 因此, REQ(validator=check_int)會完全忽略參數的默認值,例如REQ(validator=check_int)

請記住,即使PEP 0484和typing模塊是Python 3.5的正式組成部分,mypy還是一個單獨的項目,在許多情況下它已經運行良好,但仍在開發中。

用於運行時類型檢查的斷言:

def fun(request, message: int):
    assert isinstance(message, int)
    # function body

mypy會忽略此類斷言,但在執行函數時將對其進行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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