簡體   English   中英

我如何記錄函數參數的字典鍵?

[英]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 ,但不顯示其鍵。

我想要完成的是兩件事。

  • 當 function 參數是字典時提供關鍵提示(最重要)
  • 使用 sphinx 生成文檔,以便鍵反映在文檔中。

編輯

正如評論指出的那樣,我可以在某種程度上使用**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)

...看看您的編輯器是否可以使用該表單提供更好的提示。

我已經使用以下代碼縮小了可能的解決方案。 它滿足大部分要求:

  • mypy 類型檢查通過
  • 顯示鍵
  • 文檔還顯示了鍵和類型
  • 該解決方案的主要提示是 mypy 認為該值是可選的,因為它具有默認值,因此該解決方案並不完整。

使用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.

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