代码之家  ›  专栏  ›  技术社区  ›  alelom

Python:将类型提示与注释一起使用

  •  2
  • alelom  · 技术社区  · 2 年前

    在Python中,我们都知道 Type hints ,从2015年开始提供:

    def greet(name: str) -> str:
        return "Hello, " + name
    

    我们也知道 Function Annotations ,特别是在这里,我指的是文本注释,如:

    def greet(name: "The name of the person to greet") -> str:
        return "Hello, " + name
    

    但是 可以使用类型提示吗 在一起 带有文本函数注释 ?

    例如:

    def greet(name: str, "The name of the person to greet") -> str:
        return "Hello, " + name
    

    最后一个抛出了一个错误。

    我似乎在PEP或Python文档中找不到任何关于这是否可能的来源。虽然我没有特别深入地搜索,但我仍然希望能找到潜在答案。

    0 回复  |  直到 2 年前
        1
  •  2
  •   Samwise    2 年前

    由于注释可以是任何表达式(就Python解释器而言),因此从技术上讲,您可以使用元组作为注释:

    def greet(name: (str, "The name of the person to greet")) -> str:
        return "Hello, " + name
    

    正如您所期望的那样,它显示在函数的注释dict中:

    >>> greet.__annotations__
    {'name': (<class 'str'>, 'The name of the person to greet'), 'return': <class 'str'>}
    

    然而,这只是 有用的 如果你有工具知道它的含义。据我所知,现有的静态类型检查器、linter、文档生成器等都无法识别类型和描述的元组注释。

    实际上,我建议使用类型的注释 只有 ,因为这绝大多数是标准用法,并且使用注释或文档字符串来获取更多信息。

        2
  •  0
  •   Mario Ishac    2 年前

    正如Samwise所说,类型检查器不会理解注释是否是类型和描述的元组(或者您希望附加的任何其他元数据)。 PEP 593 – Flexible function and variable annotations 通过以下方式准确地解决了这一问题:

    from typing import Annotated
    
    @dataclass
    class Description:
        x: str
    
    def greet(name: Annotated[str, Description("The name of the person to greet")]) -> str:
        return "Hello, " + name
    

    我们引入包装器类的原因 Description 很明显,编写的字符串是我们使用的描述,所以其他分析注释的库在使用时不会混淆 str 以获取自己的元数据。

    然后,根据 typing.Annotated ,您可以使用 typing.get_type_hints(name, include_extras=True) 以在运行时获取描述。