对于IDE中的代码完成和类型提示,只需为Person
和Address
类添加静态类型,就可以开始了.假设您使用的是最新的python3.6
,下面是示例中typescript类的大致类似功能:
# spam.py
from typing import Optional, Sequence
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
def __init__(self, street: str, housenumber: int,
housenumber_postfix: Optional[str] = None) -> None:
self.street = street
self.housenumber = housenumber
self.housenumber_postfix = housenumber_postfix
class Person:
name: str
adresses: Sequence[Address]
def __init__(self, name: str, adresses: Sequence[str]) -> None:
self.name = name
self.adresses = adresses
person = Person('Joe', [
Address('Sesame', 1),
Address('Baker', 221, housenumber_postfix='b')
]) # type: Person
我想你提到的样板是在添加类构造函数时出现的.这确实是不可撤销的.我希望默认构造函数在运行时生成,而不是显式声明,如下所示:
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
class Person:
name: str
adresses: Sequence[Address]
if __name__ == '__main__':
alice = Person('Alice', [Address('spam', 1, housenumber_postfix='eggs')])
bob = Person('Bob', ()) # a tuple is also a sequence
但不幸的是,您必须手动声明它们.
编辑
正如Michael0x2a在comment中指出的,python3.7
引入了@dataclass
装饰符,因此可以避免对默认构造函数的需求,因此可以声明:
@dataclass
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
@dataclass
class Person:
name: str
adresses: Sequence[Address]
并获得几种方法的默认impl,从而减少样板代码的数量.查看PEP 557了解更多详细信息.
我猜您可以看到可以从代码生成的存根文件,作为某种类型的接口文件:
$ stubgen spam # stubgen tool is part of mypy package
Created out/spam.pyi
生成的存根文件包含模块的所有非私有类和函数的类型化签名,无需实现:
# Stubs for spam (Python 3.6)
#
# NOTE: This dynamically typed stub was automatically generated by stubgen.
from typing import Optional, Sequence
class Address:
street: str
housenumber: int
housenumber_postfix: Optional[str]
def __init__(self, street: str, housenumber: int, housenumber_postfix: Optional[str]=...) -> None: ...
class Person:
name: str
adresses: Sequence[Address]
def __init__(self, name: str, adresses: Sequence[str]) -> None: ...
person: Person
IDE也可以识别这些存根文件,如果原始模块不是静态类型,它们将使用存根文件进行类型提示和代码完成.