请解释以下代码的工作原理和下面提到的一些问题

Please explain the working of following code and some questions mentioned below

import keyboard
def fun1(r):
    print(r.name)    
keyboard.on_press(fun1)

代码是一个简单的键盘记录器,这里到底发生了什么?

目前我理解的是:

  1. 进口
  2. 函数定义
  3. keyboard.on_press被称为

请说明以下内容

  1. keyboard.on_press(fun1) 传递给 fun1()
  2. 的究竟是什么
  3. 为什么参数对 fun1 很重要
  4. 如果我不想做一个函数只是想把我的代码放在 [keyboard.on_press("here")] 中怎么办,为什么不可能。

还有几个问题

with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()
  1. 这里的“with”语句是怎么回事?
  2. 什么 .join() {将它加入主线程是什么意思}
  3. 我们在哪里写的 on_press=on_press {为什么不只写一次}

我不知道这个查询是否依赖于 python 的版本或模块的版本。 我正在使用所有最新版本。 到目前为止,我阅读了有关的文档 https://pynput.readthedocs.io/en/latest/keyboard.html 并用谷歌搜索了我所有的问题,但找不到简单的解释。

下面是一些带有注释的代码,有助于解释语法:

import keyboard

def somefunc(msg):
    print(msg)  # here

def fun1(r):  # r is keyboard event
    print(type(r))   #  <class 'keyboard._keyboard_event.KeyboardEvent'>
    print(r.name)   # key text
    somefunc("here")   # call some other function
    
keyboard.on_press(fun1) # pass a reference to the other function (on_press will call whatever function we pass), other function must have single parameter

while True: pass  # keep script running

With 关键字只是确保对象正确关闭,即使出现错误也是如此。

with keyboard.Listener(
        on_press=on_press,   # named parameter is on_press, we are passing a reference to function on_press
        on_release=on_release) as listener:  # named parameter is on_release, we are passing a reference to function on_release
    listener.join()  # wait for listener thread to finish

# Is shortcut syntax for:

listener = keyboard.Listener(on_press=on_press, on_release=on_release)
try:
    ........
finally:
    listener.stop()  # always do this, even if error
listener.join()

关于双变量。这看起来很奇怪,我知道。该代码使用命名参数。

# sample function
def myfunc(x):   # the parameter name is x
    print(x)
    
# We can call myfunc several ways:
myfunc(1)  # pass value directly
myfunc(x=1)  # specify parameter to assign

x=1  # local variable
myfunc(x)  # pass the local variable as parameter
myfunc(x=x)  # specify parameter to assign, pass local variable # this is the double text you're seeing  

关于回调函数,可以将一个函数引用传递给另一个函数。

def MyCallback(a,b):  # custom function
    print(a,b) 
    
def SomeEventHandler(f): # parameter is reference to another function 
    f(1,2)  # call passed in function, it must have these parameters
    
SomeEventHandler(MyCallback)  # pass custom function to handler

我希望这能让事情更清楚一些。