Python多返回类型提示最佳实践:多类型返回是否应改用Any?
问题
给定以下Python方法,其返回类型包含配置文件中允许的所有类型:
def get_config(self, key: str | None = None) -> int | dict | str | list | bool | None: return self._config[key] if key else self._config
已知配置文件中的可用类型仅限上述指定类型,请问:
- 何时这类具体的类型列表会显得冗余?
- 是否应直接将返回类型设为
Any?
回答
什么时候具体类型列表会显得冗余?
- 要是调用这个方法的代码完全不依赖返回值的类型做任何逻辑处理——比如只是把返回值直接存数据库、转JSON打印,根本不会去判断类型(比如
isinstance(val, list))或者调用类型专属方法(比如字符串的strip()、列表的extend()),那写这一串具体类型就纯属多余,还平白增加维护成本:以后配置新增类型,还得回来更新这个注解。 - 当这个方法是个底层通用工具,上层每个调用方都明确知道自己要拿的是什么类型,而且会自行做类型断言(比如
cast(str, get_config("name")))或者处理,这时方法本身的详细返回类型注解对调用方来说没啥用,就显得冗余。
要不要直接用Any?
别直接上Any,除非你彻底放弃静态类型检查的价值。原因很简单:
Any会让类型检查器直接“罢工”,调用方要是误用类型(比如把布尔值当列表遍历),静态检查根本查不出来,只能等运行时炸锅,这完全违背了加类型注解的初衷。- 就算觉得长串类型看着烦,也可以用自定义联合类型来简化,比如先定义:
然后方法返回类型写成ConfigValue = int | dict | str | list | bool | None-> ConfigValue,既保留了类型约束,又避免重复写一大串,以后要加新类型也只需要改ConfigValue的定义就行,灵活得很。 - 只有当配置的类型完全没谱、随时会乱改,而且你完全不在乎类型检查能帮你提前发现问题时,才考虑用
Any——但正规项目里这种情况真的很少见。
内容的提问来源于stack exchange,提问作者rkr87
相关产品推荐
相关产品推荐

