【发布时间】:2021-10-09 15:44:50
【问题描述】:
我在某处读到,使用具体类型键入返回值是最佳实践,但尽管我付出了所有努力,但还是找不到我读到的资源... 至少有一个关于SO的答案。查看了 PEP 和 mypy 文档,但找不到...
【问题讨论】:
-
不确定。对于任何给定的情况,我通常会尝试“尽可能具体”。
-
根据经验,请使用在所有可能的返回值中都一致的最具体的类型。有些方法会根据参数类型返回不同的类型(例如,在给定列表时返回
list的方法,在给定元组时返回tuple),在这些情况下,它们必须将其返回类型列为包括两者。但提供更具体的返回类型始终是一个优势 - 毕竟,list仍然符合Iterable的条件,但反之则不然。 -
我一直听到并遵循的规则是“返回时最具体,接受时尽可能广泛”。调用者应该被允许传入任何兼容的结构,同时也能够依赖给它们的类型。
-
您应该尽可能具体地注释返回类型。换个角度想一想,如果您更喜欢特定类型而不是特定类型,那么使用
Any注释成为最佳选择,但显然这没有用(对于您的函数的用户;对于作为开发人员的您来说,它没有用有所作为(除非您是自己函数的用户))。对于参数类型,它是不同的,您应该指出您期望从参数中获得的最低要求,以便在您的函数中工作(作为开发人员,您非常关心功能 的论点)。 -
@Josiah 我认为这真的取决于您是定义接口(协议等)还是具体方法。当然,对于接口,应用与函数参数相同的想法(即尽可能广泛),但对于具体方法,最好指出实际返回的类型(特定类型包括更抽象的属性) .