【问题标题】:Annotating parameters with non-type objects用非类型对象注释参数
【发布时间】:2020-03-22 10:48:25
【问题描述】:

我正在开发一个框架,它采用 python 函数并将它们转换为容器化程序。 我需要一种用一些扩展信息来注释函数参数的方法。 为此,我开始使用 Python 的“参数注释”/“类型提示”。 但是我听到一些传言说,将来非类型的注释将变得非法。真的吗? 我的框架可以在注解中使用非类型对象吗?

def my_func(
    param1: 'foo',
    param2: 'foo bar',
    param3: {'a' : 1},
):
    pass

【问题讨论】:

  • 你从哪里听到这样的谣言?顺便说一句,param1: 'foo' 目前被用作每个 PEP-484 的 forward reference
  • 严格来说,像typing.List 这样的东西已经是非类型对象了。问题是,使用不符合 PEP-484 的注释会继续被接受吗?
  • 我猜,谣言更像是eval(annotation_literal)必须有效。
  • 您可能对PEP 593 感兴趣,它为您提供了一种创建注释的方法,其中包含类型提示和其他任意表达式的混合。这为您提供了一种将任意元数据附加到注释的方法,同时仍然保持代码与 PEP 484 类型检查器兼容。

标签: python python-3.x annotations type-hinting


【解决方案1】:

当 PEP-484 发布时,它特别允许将函数注释用于任何您喜欢的目的:

请注意,此 PEP 仍然明确不阻止注释的其他用途,也不需要(或禁止)任何特定的注释处理,即使它们符合本规范。它只是实现了更好的协调,就像 PEP 333 对 Web 框架所做的那样。

如果注释用于提示,PEP-484 只是标准化了类型提示的外观。


然而,PEP-563 包含一个似乎与此相矛盾或覆盖的注释:

注解的非打字使用

虽然注释仍然可用 除了类型检查之外的任意使用,值得一提的是 此 PEP 的设计及其前身(PEP 484 和 PEP 526),主要受类型提示用例的启发。

在 Python 3.8 中,PEP 484 将从临时状态毕业。其他 对 Python 编程语言的增强,例如 PEP 544、PEP 557、 或 PEP 560,已经在此基础上构建,因为它们依赖于 PEP 484 定义的类型注释和类型模块。事实上, PEP 484 在 Python 3.7 中保持临时性的原因是启用 另一个发布周期的快速演变,其中一些 需要上述增强功能。

考虑到这一点,使用与 上述 PEP 应被视为已弃用。

我没有看到任何在 563 之后提到 function 注释的 PEP,不过,只有变量注释。


暂时建议你可以继续使用你喜欢的函数注释,只要你知道这样的使用与mypy之类的工具不兼容.

from __future__ import annotations 停止评估注释并将它们视为原始字符串(这将成为 Python 4 中的默认行为)这一事实表明,如果您坚持使用字符串现在,将会继续是没有使用非类型提示注释的运行时后果。 (也就是说,不要依赖你的注释来实际评估。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2014-09-09
    • 2022-06-16
    • 1970-01-01
    • 2012-07-28
    • 2018-08-01
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多