繁体   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