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 |
号