我正在定义一个Python类:
class Foo:
bar = property(lambda self: Bar(self))
我想注释bar
属性,说它包含一个类Bar
的项目。有可接受的方式吗?我知道这是有效的Python语法:
bar: Bar = property(lambda self: Bar(self))
但这是一种可以接受财产注释的方式吗?
如果您想要安全,只需将其重构为使用装饰器表单并指定返回值:
class Foo:
@property
def bar(self) -> Bar:
return Bar(self)
这也是typeshed
中使用的形式,它收集标注库的注释,并顺利通过mypy
。
至于Python 3.6的变量注释语法,形式如下:
bar: Bar = property(lambda self: Bar(self))
在使用mypy
查看时,目前可以接受。
在这种情况下。我很可能会借鉴其他语言的设计。以Scala为例:
object A {
def property: Int = { println("property called"); 1 }
}
A.property
// property called
// res: Int = 1
Scala语言具有统一访问原则:
在使用属性,预先计算属性或无参数方法访问之间,用户应该没有区别。
理论上的可计算属性只是具有零参数的函数,例如,斯卡拉的()=>T
。从用户的角度来看,它应该是类型为T
的常量属性。
回到问题,如果我们借用原则(在我看来这很好),类型应该只是返回类型 - Bar
,而不是Python中的property
装饰器类型。