最近我一直在使用 Typescript,它允许表达如下内容:
interface Address {
street: string;
housenumber: number;
housenumberPostfix?: string;
}
interface Person {
name: string;
adresses: Address[]
}
const person: Person = {
name: 'Joe',
adresses: [
{ street: 'Sesame', housenumber: 1 },
{ street: 'Baker', housenumber: 221, housenumberPostfix: 'b' }
]
}
非常简洁,并在使用 Persons 编码时提供了类型检查和代码完成等所有功能。
这是如何在 Python 中完成的?
我一直在研究 Mypy 和 ABC,但还没有成功地找到 pythonic 方法来做与上述类似的事情(我的尝试导致了太多符合我口味的样板文件)。
原文由 Otto 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于 IDE 中的代码完成和类型提示,只需为
Person
和Address
类添加静态类型,你就可以开始了。假设您使用最新的python3.6
,这是您示例中的打字稿类的粗略等效项:我想您提到的样板是在添加类构造函数时出现的。这确实是不可避免的。我希望在未明确声明时在运行时生成默认构造函数,如下所示:
但不幸的是你必须手动声明它们。
编辑
正如 Michael0x2a 在 评论 中指出的那样,在
python3.7
中可以避免对默认构造函数的需求,它引入了@dataclass
装饰器,因此确实可以声明:并获取几个方法的默认实现,减少样板代码的数量。查看 PEP 557 了解更多详情。
我想您可能会看到可以从您的代码生成的存根文件,作为某种接口文件:
生成的存根文件包含模块的所有非私有类和函数的类型化签名,但没有实现:
这些存根文件也被 IDE 识别,如果您的原始模块不是静态类型的,它们将使用存根文件进行类型提示和代码完成。