Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在文件中打印时python中的增量变量_Python - Fatal编程技术网

在文件中打印时python中的增量变量

在文件中打印时python中的增量变量,python,Python,大家好,我有一段简短的代码,当程序运行时,我在一个文件中按键盘上的每个键,每行一个。 问题是,我希望每一行都有一个ID,很明显,这个ID每次都是不同的,我认为更简单的方法是使这个ID成为一个int,在每次写操作后递增;但我就是不能让它工作,它总是打印相同的整数 # detect key press def on_press(key, myint=0): try: f = open("logger.txt", "a")

大家好,我有一段简短的代码,当程序运行时,我在一个文件中按键盘上的每个键,每行一个。 问题是,我希望每一行都有一个ID,很明显,这个ID每次都是不同的,我认为更简单的方法是使这个ID成为一个int,在每次写操作后递增;但我就是不能让它工作,它总是打印相同的整数

# detect key press
def on_press(key, myint=0):
    try:
        f = open("logger.txt", "a")
        upper = str(key.char).upper()
        f.write('{' + '"KeyPressed"' + ':' + '"' + upper + '","_id":"' + str(myint) + '"},' '\n')
        myint += 1
        f.close()
...

with keyboard.Listener(
        on_press=on_press) as listener:
    listener.join()
在这种情况下,如果我运行程序并按:A S D 输出为:

{"KeyPressed":"A","_id":"0"},
{"KeyPressed":"S","_id":"0"},
{"KeyPressed":"D","_id":"0"},

有可能实现我的目标吗?

问题是每次调用
on\u press
时,它都会得到一个新的
myint
副本,而不是使用一个更改的持久副本

您可以使用一个简单的闭包来修复它,该闭包将状态保存在父函数中:

def get_on_press(myint=0):
    def on_press(key):
        nonlocal myint
        print("on_press:  key: {}  myint: {}".format(key, myint))
        myint += 1
    return on_press

on_press = get_on_press()
然后,您可以按正常呼叫

>>> on_press("a")
on_press:  key: a  myint: 0
>>> on_press("b")
on_press:  key: b  myint: 1
>>> on_press("c")
on_press:  key: c  myint: 2
>>> 


问题是每次调用_press
上的
,它都会得到一个新的
myint
副本,而不是使用一个更改的持久副本

您可以使用一个简单的闭包来修复它,该闭包将状态保存在父函数中:

def get_on_press(myint=0):
    def on_press(key):
        nonlocal myint
        print("on_press:  key: {}  myint: {}".format(key, myint))
        myint += 1
    return on_press

on_press = get_on_press()
然后,您可以按
正常呼叫

>>> on_press("a")
on_press:  key: a  myint: 0
>>> on_press("b")
on_press:  key: b  myint: 1
>>> on_press("c")
on_press:  key: c  myint: 2
>>> 


myint不应该是函数范围之外的变量吗?您没有在函数中返回增量。myint不应该是函数范围之外的变量吗?您没有在函数中返回增量。有多种其他方法可以解决此问题。可以使用全局变量;或函数的属性;或者,您可以将函数转换为某个类的方法,然后使用class或instance属性。@KarlKnechtel是的,尽管我喜欢能够有多个实例和它们自己的独立计数器的想法。课堂解决方案也是一种很好的方法。解决这个问题还有很多其他的方法。可以使用全局变量;或函数的属性;或者,您可以将函数转换为某个类的方法,然后使用class或instance属性。@KarlKnechtel是的,尽管我喜欢能够有多个实例和它们自己的独立计数器的想法。类解决方案也是一种很好的方法。