最近我经常使用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' }
]
}
非常简洁,在与人进行编码时提供了类型检查和代码完成等所有奢侈品。
在Python中是如何做到的?
我一直在看Mypy和ABC,但还没有成功地找到像上面这样做的pythonic方法(我的尝试导致太多的样板对我的口味)。
我发现的一个简单的解决方案(不需要Python 3.7)是使用SimpleNamespace:
person.name = 1
如果有人能指出为什么Python 3.7的
dataclass
decorator会更好,我很想听听。对于ide中的代码完成和类型提示,只需为
Person
和Address
类添加静态类型,就可以了。假设您使用最新的python3.6
,下面是示例中typescript类的大致等价物:我想您提到的样板是在添加类构造函数时出现的。这确实是不可撤销的。我希望默认构造函数在运行时生成,而不是显式声明,如下所示:
但不幸的是你必须手工申报。
编辑
正如Michael0x2a在comment中指出的,在引入
python3.7
装饰器的@dataclass
中,可以避免对默认构造函数的需要,因此可以声明:并获得几个方法的默认impl,从而减少样板代码的数量。查看PEP 557了解更多详细信息。
我想您可以看到从代码生成的存根文件,作为某种接口文件:
生成的存根文件包含模块的所有非私有类和函数的类型化签名,但没有实现:
IDE也可以识别这些存根文件,如果原始模块不是静态类型的,它们将使用存根文件进行类型提示和代码完成。
Python 3.6添加了一个新的namedtuple实现,它与类型提示一起工作,从而删除了其他答案所需的一些样板文件。
编辑:
NamedTuple
是不可变的,因此请注意,如果要修改对象的字段,则不能使用此解决方案。改变lists
和dicts
的内容仍然可以。相关问题 更多 >
编程相关推荐