IIFE在python共同惯例中

IIFE in python common convention

我正在考虑一个类似的案例,我问过这样一个问题:设置超时函数回调静态变量

但是,在Python中。我试过做一些搜索,但似乎找不到它。

我在考虑我是否有一个场景需要在将来执行一个操作,并且需要等待(例如计时器),但是操作可能需要在那个时刻的数据(当我调用将来要调用回调的函数时)。

在JavaScript中,我了解到有绑定操作,或者使用闭包。

我想知道人们是否真的在Python中这样做,如果是这样,关于它的常见约定是什么?

我在想这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import threading
import time
x ="ABCD"
class Typewriter(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
       time.sleep(5)
       print x
# make it type!
def foo(q):
   q

def bar():
   typer = Typewriter()
   typer.start()


s = bar()
foo(s)
x ="DEF"

我不能真的将一个值传递给foo(s),(我尝试了foo(s(x)),得到了相同的结果)。

有没有类似于python的东西?我可以说做

foo(s(q).bind(x))

如果是的话,正常的惯例是什么?这里有不止一种给猫剥皮的方法吗?

(我知道从技术上讲,我可以在打字机类初始化中使用x,这会在变量x改变之前发生,但是我想不出一种更好的方法来表达第一个问题中的等价函数)。我的主要目标是能够传递将来要使用的变量,而不是或多或少地间接地使用它。


您可以将函数传递到线程中。如果要更改回调变量,请使用队列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import threading
import time
from Queue import Queue
x = Queue()
x.put('ABCD')
class Typewriter(threading.Thread):
    def __init__(self,callback):
        self.callback = callback
        threading.Thread.__init__(self)

    def run(self):
       time.sleep(5)
       self.callback( x.get() )


def foo(q):
   print time.time(), q

typer = Typewriter(foo)
typer.start()
typer.join()

x.put("DEF" )
typer = Typewriter(foo)
typer.start()

输出:

1
2
1423295560.07 ABCD
1423295565.08 DEF