Python函数无有效返回值场景下的处理最佳实践
单返回值函数无有效返回场景的主流处理方案
当函数无法计算出有效返回值时(比如字典查找未匹配到对应key),针对仅返回1个值或无返回值的场景,目前行业内公认的处理方案主要有以下三种:
1. 返回None
Python内置的dict.get()方法就采用了该模式,实现逻辑简单直接。
该方案的缺点是调用方必须额外检查返回值是否为None,再根据检查结果执行对应逻辑,漏判很容易导致后续代码出现类型错误。
示例代码如下:
from typing import Optional def getprice(car: Car) -> Optional[int]: if ispriceless(car): return None return car.value def client(): average_car_price_on_market = mean( [getprice(car) for car in get_all_cars() if getprice(car) is not None] )
注:实际开发中无需重复调用两次
getprice,此处仅为突出该写法的繁琐特性。
2. 使用yield返回生成器
本质上相当于返回一个包含0个或1个元素的可迭代对象,在批量处理场景下可以简化调用方的过滤逻辑。
该方案的优势是在列表推导等场景下写法更简洁,可读性稍强;缺点是逻辑显性度不足,不熟悉该模式的开发者很容易忽略返回值是生成器的特性。
示例代码如下:
from typing import Generator def getprice(car: Car) -> Generator[int, None, None]: if not ispriceless(car): yield car.value def client(): average_car_price_on_market = mean( [price for car in get_all_cars() for price in getprice(car)] )
3. 抛出异常
这是逻辑最显性的处理方案,调用方只要没有捕获异常就会直接终止执行,不会出现无效值向下游传递的问题。
该方案的争议点主要有两个:一是异常处理会带来额外的性能开销,二是目前行业内普遍不推荐将异常作为常规控制流使用。
内容的提问来源于stack exchange,提问作者Ryota Tomioka
相关产品推荐
相关产品推荐

