【问题标题】:Type annotation for dict arguments [duplicate]dict参数的类型注释[重复]
【发布时间】:2020-11-21 07:07:44
【问题描述】:

我可以为 python 中的函数的参数指定特定的字典形状/形式吗?

就像在打字稿中一样,我会指出info 参数应该是一个带有字符串name 和一个数字age 的对象:

function parseInfo(info: {name: string, age: number}) { /* ... */ }

有没有办法使用 Python 函数来做到这一点:

def parseInfo(info: dict):
  # function body

或者这可能不是 Pythonic,我应该使用命名关键字或类似的东西?

【问题讨论】:

标签: python


【解决方案1】:

在 Python 3.8+ 中,您可以使用 alternative syntax 创建 TypedDict

from typing import TypedDict

Info = TypedDict('Info', {'name': str, 'age': int})


def parse_info(info: Info):
    pass

来自 TypedDict 的文档:

TypedDict 声明了一个字典类型,它需要所有的实例 拥有一组特定的键,其中每个键都与一个 一致类型的值。在运行时不检查此期望 但仅由类型检查器强制执行。

【讨论】:

  • 谢谢,这是实际正确的简单答案。现在,如果我访问不在类型定义中的字段,我会收到警告。但是,我注意到当我 call parse_info 使用不正确的 dict 时,我没有看到任何错误或警告(在 PyCharm 中)。这是预期的行为吗?
  • @JonathanTuzman 这将取决于 PyCharm 如何进行类型检查,也许您可​​以搜索一下这是否是他们方面的问题。似乎有一些 issues 带有 TypedDict 和自动完成功能,但我无法确定您的案例是否符合其中一个问题。
【解决方案2】:

也许您可以执行以下操作:

def assertTypes(obj, type_obj):
    for t in type_obj:
        if not(t in obj and type(obj[t]) == type_obj[t]):
            return False
    return True

def parseInfo(info):
    if not assertTypes(info, {"name": str, "age": int}):
        print("INVALID OBJECT FORMAT")
        return
    #continue

>>> parseInfo({"name": "AJ", "age": 8})
>>> parseInfo({"name": "AJ", "age": 'hi'})
INVALID OBJECT FORMAT
>>> parseInfo({"name": "AJ"})
INVALID OBJECT FORMAT
>>> parseInfo({"name": 1, "age": 100})
INVALID OBJECT FORMAT
>>> parseInfo({"name": "Donald", "age": 100})
>>> 

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2020-03-22
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多