微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

初始化 TypedDict 并稍后填充键和值

如何解决初始化 TypedDict 并稍后填充键和值

我有一个字典,其中的键和值的类型是固定的。我想在 TypedDict 中定义类型如下:

class MyTable(TypedDict):
    caption: List[str]
    header: List[str]
    table: pd.DataFrame
    epilogue: List[str]

我有返回 MyTable函数。我想先定义一个空的 (Typed)dict 并填写键和值。

def returnsMyTable():
    result = {}
    result['caption'] = ['caption line 1','caption line 2']
    result['header'] = ['header line 1','header line 2']
    result['table'] = pd.DataFrame()
    result['epilogue'] = ['epilogue line 1','epilogue line 2']
    return result

这里 MyPy 抱怨需要结果的类型注释。我试过这个:

result: MyTable = {}

但随后 MyPy 抱怨密钥丢失。同样,如果我定义键但将值设置为 None,它会抱怨值的类型不正确。

是否可以先将 TypedDict 初始化为空的 Dict,然后再填充键和值? docs 似乎暗示它是。

我想我可以先将这些值定义为变量,然后再组合 MyTable,但我正在处理要向其添加类型提示的遗留代码。所以我想尽量减少工作。

解决方法

您在这里可能想要的是设置整体性,但我会三思而后行。

引用 the PEP

默认情况下,所有键都必须存在于 TypedDict 中。可以通过指定总体来覆盖它。以下是使用基于类的语法执行此操作的方法:

class MyTable(TypedDict,total=False):
    caption: List[str]
    header: List[str]
    table: pd.DataFrame
    epilogue: List[str]

result: MyTable = {}
result2: MyTable = {"caption": ["One","Two","Three"]}

正如我所说,请三思。总计 TypedDict 可以很好地保证所有项目都存在。也就是说,因为 MyPy 不允许没有“标题”的结果存在,所以您可以安全地调用 cap = result["caption"]

如果您设置 total=False,则该保证将消失。假设您使用 MyTable 的频率比实际使用频率高得多,那么在使用它时获得额外的安全保证可能是一笔不错的交易。

就我个人而言,我会保留 total=False 用于创建代码有时确实遗漏某些内容并且使用它的任何代码都必须处理的情况。如果只是需要几行来初始化,我会这样做:

def returnsMyTable():
    result = {}
    result_caption = ['caption line 1','caption line 2']
    result_header = ['header line 1','header line 2']
    result_table = pd.DataFrame()
    result_epilogue = ['epilogue line 1','epilogue line 2']
    result = {
        "caption": result_caption,"header": result_header,"table": result_table,"epilogue": result_epilogue
    }
    return result

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。