Python中如何将带参数函数传入高阶函数并避免提前执行?
问题解决:带参数函数传入后提前执行的问题
你的问题核心是传递函数时直接加括号调用:test("John")会立刻执行test函数并返回结果,而非把函数本身传递给await_char。下面提供两种可行方案,同时满足func作为可选参数的需求:
方法1:用lambda表达式包裹带参数的调用
无需修改原await_char函数,仅在调用时用lambda把带参数的函数调用包装成无参可调用对象,这样只有触发时才会执行目标函数:
def await_char(param, func="", msg=""): import keyboard if msg == "": msg_out = 'Press {} to continue'.format(param.upper()) else: msg_out = msg print(msg_out) while True: if keyboard.is_pressed("c") or keyboard.is_pressed("C"): break if keyboard.is_pressed(param): if func: func() break def test(msg): print(msg) # 用lambda包裹,传递可调用对象 await_char("y", "press some button, like: Y", lambda: test("John")) # 不传递func的场景也支持 await_char("y", msg="Just press Y to continue")
lambda是一个匿名无参函数,只有当await_char内部触发func()时,才会执行test("John")。
方法2:修改await_char,支持传递函数与参数
如果需要更灵活地给目标函数传参,可以改写await_char,将func设为默认None的可选参数,同时用*args和**kwargs接收函数参数:
def await_char(param, msg="", func=None, *args, **kwargs): import keyboard if msg == "": msg_out = 'Press {} to continue'.format(param.upper()) else: msg_out = msg print(msg_out) while True: if keyboard.is_pressed("c") or keyboard.is_pressed("C"): break if keyboard.is_pressed(param): if func: func(*args, **kwargs) break def test(msg): print(msg) # 传递函数本身 + 对应参数 await_char("y", "press some button, like: Y", test, "John") # 不传递func的场景正常工作 await_char("y")
这种方式支持给func传递任意数量的位置参数或关键字参数,同时保持func的可选性。
另外优化了原代码的按键判断逻辑,把重复的大小写判断合并,让代码更简洁。
内容的提问来源于stack exchange,提问作者Zakrzaq
相关产品推荐
相关产品推荐

