Python类型注释:任何注释属性的方法吗?

时间:2017-02-26 00:45:44

标签: python python-3.x annotations

我定义了一个Python类:

class Foo:
    bar = property(lambda self: Bar(self))

我想注释bar属性,说它包含类Bar的项目。有可接受的方式吗?我知道这是有效的Python语法:

bar: Bar = property(lambda self: Bar(self))

但这是一种可以接受财产注释的方式吗?

2 个答案:

答案 0 :(得分:1)

如果您想要安全,只需将其重构为使用装饰器表单并指定返回值:

class Foo:
    @property
    def bar(self) -> Bar:
        return Bar(self)

这也是typeshed中使用的表单,它收集标注库标注库的存根,并顺利通过mypy

对于Python 3.6的变量注释语法,形式为:

bar: Bar = property(lambda self: Bar(self))
使用mypy进行核对时,

目前可以接受。

答案 1 :(得分:0)

在这种情况下。我可能会借鉴其他语言的设计。 以Scala为例:

object A {
    def property: Int = { println("property called"); 1 }
}

A.property
// property called
// res: Int = 1

斯卡拉语言牢记统一访问原则

  

使用属性,预先计算的属性或无参数方法进行访问与用户没有什么区别。

理论上,可计算属性只是一个具有零参数的函数,例如()=>T在Scala中。从用户的角度来看,它应该只是类型为T的常量属性。


回到问题,如果我们借用原理(我认为很好),则该类型应该只是返回类型-Bar,而不是Python中的property装饰器类型。