我定义了一个Python类:
class Foo:
bar = property(lambda self: Bar(self))
我想注释bar
属性,说它包含类Bar
的项目。有可接受的方式吗?我知道这是有效的Python语法:
bar: Bar = property(lambda self: Bar(self))
但这是一种可以接受财产注释的方式吗?
答案 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
装饰器类型。