Python 如何限制输出类型为字典?

Python how to restrict output type as dictionary?

我找了个例子。

from typing import List
def twoSum(nums: List[int], target: int) -> List[int]:
    pass

所以我试图将输入限制为整数,将输出限制为字典。 survey = {"sid": survey_id, "title": 22} 这行工作。但是,survey = [survey_id, 22],return类型变成list也可以。我该如何解决?

def question(survey_id: int) -> dict:
    #survey = {"sid": survey_id, "title": 22}
    survey = [survey_id, 22]
    return survey

question("3456")    
['3456', 22]

更具体地说,我想将 return 类型限制为仅包含整数和字符串的字典。我怎样才能做到?

Python 解释器无法强制函数 returns 为特定类型。如果您想在类型未正确定义时阻止程序执行,Python 不是一个好的语言选择。

另一方面,您可以使用像 mypy 这样的静态类型检查器来确保正确观察到类型提示。这些类型提示不会在运行时强制执行,但它们可以确保对函数的修改不会引入与类型相关的错误。

是的,你可以这样做,但要稍微绕一圈。虽然这种方式在您处理任何类型的 API 时非常有用。您要做的是创建一个对象和 return 这个对象,您可以在其中强制执行数据类型。

两个最好的选择是数据类,它是标准库的一部分,因为 3.8(我认为)或者更好的选择是使用 Pydantic,它也像一个数据类,但有很多附加功能。

from pydantic import BaseModel

class Survey(BaseModel):
    sid: int
    title: str

def survey_result(id: int) -> Survey:
    res = Survey(sid=id, title='foo')
    return res

现在 Pydantic 将强制执行数据类型。例如:

>>> survey_result(11)
Out: Survey(sid=11, title='foo')

>>> survey_result('blabla')
Out: 
ValidationError: 1 validation error for Survey
sid  value is not a valid integer (type=type_error.integer)

Pydantic 还针对 Web APIs 进行了优化,并且可以在必要时转换数据类型。比如说,你应该有一个整数,但结果被 return 编辑为 json 并且无论出于何种原因,整数变成了一个字符串。 Pydantic 可以处理这个问题:

>>> survey_result('11')
Out: Survey(sid=11, title='foo')