如何解决将参数传递给回调
键盘模块上的add_word_listener
有点麻烦。如果我有一个接受回调作为参数的函数,如何将参数传递给回调?例如,这是最小的可复制代码:
import keyboard
stopKey = "Windows"
def test(arg):
print(arg)
keyboard.add_word_listener("hi",test("Hello World!"))
running = True
while running:
if keyboard.is_pressed(stopKey):
running = False
add_word_listener
是一个具有2个必需参数,其侦听文本和回调的函数。在键盘文档页面上,回调参数被描述为“每次键入单词时都会调用的无参数函数”。那么这是否意味着我无法将参数传递给test
中的add_word_listener
函数?该代码仅在我们删除参数并仅具有keyboard.add_word_listener(“ hi”,test)时有效。如果这是唯一的方法,是否有更好的方法在此处传递带有参数的函数,而不是创建许多特定的函数?即不要创建类似
def printhi():
print("hi")
def printhello():
print("hello")
每次我想使用add_word_listener
吗?
解决方法
martineau 提到了lambda作为解决方案
keyboard.add_word_listener("hi",lambda: test("Hello World!"))
另一个是functools.partial
keyboard.add_word_listener("hi",functools.partial(test,"Hello World!"))
您甚至可以使用__call__
方法而非函数来创建类
class Test:
def __init__(self,arg):
self.arg = arg
def __call__(self):
print(self.arg)
keyboard.add_word_listener("hi",Test("Hello World!"))
如果您想保留一些额外状态,那么最后一个很有用。就像一个虚构的示例一样,如果您想记录何时进行回调,则可以
class Test:
def __init__(self,arg):
self.arg = arg
def __call__(self):
self.called_at = time.time()
print(self.arg)
test = Test("Hello world")
keyboard.add_word_listener("hi",test)
,
我喜欢以上两种解决方案。如果lambda吓到了您,您还可以使用其他功能。
def my_callback():
test("hello")
keyboard.add_word_listener("hi",my_callback)
您甚至可以像这样编写更多通用代码:
def add_my_word_listener(word,callback_word):
def my_callback():
test(callback_word)
keyboard.add_word_listener(word,my_callback)
add_my_word_listener("hi","hello")
add_my_word_listener("ciao","goodbye")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。