[英]How can i document dictionary keys for a functions argument?
我試圖弄清楚如何在不使用Dict[str, str]
的情況下為傳遞給 function 的字典參數提供類型提示,因為它不提供鍵的含義。
到目前為止,我已經嘗試了兩種方法,一種是使用typing_extensions
以便我可以與 3.6 兼容,也可以與pydantic
,但我無法顯示命中。
考慮這個示例代碼:
from typing_extensions import TypedDict
from pydantic import BaseModel
class Some(TypedDict):
"""keya is some key"""
keya: str
"""another_key is another key"""
another_key: str
def some(a: Some) -> None:
print(a.get('keya'))
return None
some({'keya': 'key', 'another_key': 'nonething'})
正如預期的那樣, some
function 的類型提示顯示類型Some
,但不顯示其鍵。
我想要完成的是兩件事。
正如評論指出的那樣,我可以在某種程度上使用**kwargs
來完成此操作,但這不是本意。 設置**kwargs
也不會給我類型提示。
我認為在這種情況下,向編輯器提交功能請求/提交拉取請求實際上可能會更好,以提高其類型提示的質量。 同樣,使用 sphinx,您可以提交一個拉取請求,以確保文檔正確鏈接到 Some 的定義,或者在 function 簽名本身中包含更詳細的描述。
畢竟,您面臨的問題是您的編輯器/獅身人面像的限制,而不是 Python 或類型提示,如果您從源頭解決問題,您可能會獲得更好的長期結果。
如果您使用Some
的“構造函數”而不是傳入 dict 文字,您也可能會獲得更好的結果。 至少對我來說,這樣做可以讓我在使用 PyCharm 時獲得Some
完整的關鍵提示。 不確定您的編輯器是否也會出現這種情況:
some(Some(keya='key', another_key='nonething'))
請注意,執行Some(...)
實際上只會在運行時返回一個普通的舊常規字典,因此這不會導致行為上的任何差異。
也可能值得嘗試:
x: Some = {
"keya": "key",
"another_key": "nonething",
}
some(x)
...看看您的編輯器是否可以使用該表單提供更好的提示。
我已經使用以下代碼縮小了可能的解決方案。 它滿足大部分要求:
使用validate_items
function,我可以驗證這些值是否存在。 請查看代碼片段的評論並提供建議。
from typing_extensions import TypedDict
from typing import Union
class Some(TypedDict):
keya: str
another_key: str
def validate_items(v: dict) -> None:
for key, value in v.items():
assert isinstance(value,str), '{} is required'.format(key)
# Would love to pull the type of a key from the Some class here or
# would love to put the validation in the Some class itself
def some(a: Some={'keya': '', 'another_key': ''}) -> None:
"""[summary]
Args:
a (Some, optional): [description]. Defaults to {'keya': '', 'another_key': ''}.
Returns:
[type]: [description]
"""
validate_items(dict(a))
print(a.get('keya'))
return None
在屏幕截圖中,我可以看到 mypy 正在抱怨預期的None
值,並且在彈出幫助中,我們還可以看到字典中所需的鍵與設置的類型一起傳遞。
該解決方案感覺非常hacky,並且希望對其進行任何更正以使其更加pythonic。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.