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

问题描述 投票:3回答:2

我正在定义一个Python类:

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

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

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

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

python python-3.x annotations
2个回答
1
投票

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

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

这也是typeshed中使用的形式,它收集标注库的注释,并顺利通过mypy

至于Python 3.6的变量注释语法,形式如下:

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

在使用mypy查看时,目前可以接受。


0
投票

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

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

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

Scala语言具有统一访问原则:

在使用属性,预先计算属性或无参数方法访问之间,用户应该没有区别。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.