[英]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 。 或者您可以同時使用它們...
根據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.