如何避免在Python循环中对可选回调函数进行重复检查?
如何避免在Python循环中对可选回调函数进行重复检查?
这个问题我之前写批量处理脚本的时候也遇到过——每次循环里都要做if on_progress的判断,不仅代码显得啰嗦,要是循环个几万次,虽说性能损耗其实微乎其微,但总觉得不够Pythonic。这里有两个很实用的解决思路:
方法1:给参数设置默认的空操作函数
直接把on_progress的默认值设为一个什么都不做的匿名函数,这样不管调用者传不传回调,我们都可以直接在循环里调用它,完全不用做判断:
from typing import Callable, Optional import requests def download(on_progress: Optional[Callable] = lambda *args, **kwargs: None): data = requests.get("exampleurl.com") for i in data.iter_content(): on_progress(i)
这个lambda函数接受任意参数和关键字参数,确保不管我们后续怎么调整回调的传参方式,都不会触发报错,灵活性拉满。
方法2:在函数开头提前处理回调
如果觉得默认参数用lambda不够直观,或者想给空操作加个注释说明,那可以在函数一开始就把None的情况替换成空函数,只做一次判断就够了:
from typing import Callable, Optional import requests def download(on_progress: Optional[Callable] = None): # 如果没有传入回调,就用一个空操作函数代替 if on_progress is None: def no_op(*args, **kwargs): """空操作函数,什么都不做,用于替代未传入的回调""" pass on_progress = no_op data = requests.get("exampleurl.com") for i in data.iter_content(): on_progress(i)
这种方式的好处是,空函数的意图更明确,而且只在函数开头做一次判断,后面循环里直接调用就行,逻辑上更清晰,性能也更优(尤其是循环次数极多的时候)。
你也可以用一行代码简化这个替换逻辑:
on_progress = on_progress or lambda *args, **kwargs: None
效果和上面的空函数定义完全一样,就是写法更紧凑。
总的来说,这几种方法都能帮你把循环里的重复判断去掉,让代码更简洁优雅,同时还保留了回调函数的可选性。
备注:内容来源于stack exchange,提问作者Izaan
相关产品推荐
相关产品推荐

