Python3 的“函数注释”有哪些好的用途?

新手上路,请多包涵

功能注释: PEP-3107

我遇到了一段演示 Python3 函数注释的代码。这个概念很简单,但我想不出为什么这些是在 Python3 中实现的,或者它们有什么好的用途。也许可以启发我?

这个怎么运作:

 def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
    ... function body ...

参数后冒号后面的所有内容都是“注释”, -> 之后的信息是函数返回值的注释。

foo.func_annotations 会返回一个字典:

 {'a': 'x',
 'b': 11,
 'c': list,
 'return': 9}

提供这个有什么意义?

原文由 agscala 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 676
2 个回答

我认为这实际上很棒。

来自学术背景,我可以告诉你,注释已经证明了它们对于为 Java 等语言启用智能静态分析器的价值是无价的。例如,您可以定义状态限制、允许访问的线程、体系结构限制等语义,然后有相当多的工具可以读取这些并处理它们以提供超出您从编译器获得的保证。您甚至可以编写检查先决条件/后置条件的东西。

我觉得 Python 中特别需要这样的东西,因为它的类型较弱,但实际上没有任何结构可以使它变得简单明了并成为官方语法的一部分。

除了保证之外,注释还有其他用途。我可以看到如何将基于 Java 的工具应用到 Python。例如,我有一个工具可以让你为方法分配特殊警告,并在你调用它们时给你指示你应该阅读它们的文档(例如,假设你有一个方法不能用负值调用,但它是从名称上不直观)。有了注释,我可以在技术上为 Python 编写类似这样的东西。同样的,如果有官方的语法,也可以编写一个基于标签在一个大类中组织方法的工具。

原文由 Uri 发布,翻译遵循 CC BY-SA 4.0 许可协议

函数注解是您对它们所做的。

它们可用于文档:

 def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second'):
     ...

它们可用于前提条件检查:

 def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        msg = 'Var: {0}\tValue: {1}\tTest: {2.__name__}'.format(var, value, test)
        assert test(value), msg

def is_int(x):
    return isinstance(x, int)

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    return _between

def f(x: between(3, 10), y: is_int):
    validate(f, locals())
    print(x, y)

>>> f(0, 31.1)
Traceback (most recent call last):
   ...
AssertionError: Var: y  Value: 31.1 Test: is_int

另请参阅 http://www.python.org/dev/peps/pep-0362/ 以了解实现类型检查的方法。

原文由 Raymond Hettinger 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题