在Python中围绕事件队列传递对象
因此,对于我正在研究的东西,我有一个相对复杂的设置,解释如下: 这是python。更像是一个粗略的轮廓,但它涵盖了我需要的一切。虽然下一个函数的过程是相同的,所以如果您愿意,可以随意清理它在Python中围绕事件队列传递对象,python,Python,因此,对于我正在研究的东西,我有一个相对复杂的设置,解释如下: 这是python。更像是一个粗略的轮廓,但它涵盖了我需要的一切。虽然下一个函数的过程是相同的,所以如果您愿意,可以随意清理它 #timer event that runs every .1 second and processes events in a queue some_event_timer(): events.process_next() class Event_queue: def __init__(s
#timer event that runs every .1 second and processes events in a queue
some_event_timer():
events.process_next()
class Event_queue:
def __init__(self):
self.events = []
def push(self, event, parameters):
self.events.insert(len(self.events), event, parameters)
def process_next(self):
event = self.pop(0)
event[0](event[1])
class Foo:
def __init__(self, start_value = 1):
self.value = start_value
def update_value(self, multiple):
self.value *= multiple
def return_bah(self)
return self.value + 3
class Bar:
def __init__(self, number1, number2):
self.init = number1
self.add = number2
def print_alt_value(self, in_value):
print in_value * (self.init + self.add)
这只是我的一部分,但它说明了我的问题:
做下面的事
events2 = Event_queue2()
foo1 = Foo(4) ----> foo1.value = 4 here
bar1 = Bar(4, 2)
events2.push(foo1.update_value,1.5)
events2.push(bar1.print_alt_value,foo1.value)
events2.push(bar.print_alt_value,foo1.return_bah())
events2.process_next() ----> should process update_value to change foo.value to 6
events2.process_next() ----> should process print_alt_value in bar class - expected 36
events2.process_next() ----> should process print_alt_value - expected 54
我最初预计我的输出为36 6*(4+2)
我知道为什么不是,foo1.value和foo1.return\u bah()作为一个计算参数传递(正确的术语?)。
我真正想要的是传递对变量的引用或对方法的引用,而不是在我将其放入事件队列时对其求值
有人能帮我吗
我试着搜索,但我无法准确拼凑出我想要的东西。
为了获得我现在所拥有的内容,我首先查看了以下线程:
但我不知道如何正确地支持这些参数,或者如何支持从这些参数传递另一个函数或变量引用
我想至少对于方法调用,我可能可以将参数作为foo1.return.bah传递,并在process\u next方法中进行求值,但我希望有一种通用的方法可以同时接受标准变量和方法调用,因为event\u队列将同时接受这两种方法
谢谢你的帮助
更新编辑:
所以我遵循下面的建议,非常接近,但是:
好的,所以我按照你的队列建议,非常接近我想要的,但是我不完全理解关于多个函数的第一部分
我希望能够用这个调用对象字典。
例如:
names = ["test1", "test2"]
for name in names:
names_objs[name] = Foo(4)
然后当试图通过lambda推动时
for name in names_list:
events2.push(lambda: names_objs[name].update_value(2))
不起作用。当事件实际得到处理时,它只在任何名称\u objs[name]引用上运行,如果name变量不再有效或已在函数外部修改,则它是错误的。
这其实并不奇怪,但增加了一个:
name_obj_hold = name_objs[name]
然后推也没用。它同样只对上次引用的任何名称进行操作
有人能澄清一下多重功能的问题吗。恐怕我在这件事上遇到了麻烦
基本上,我需要对初始方法调用进行评估,例如:
名称。一些功能(#这里有些东西#)
获取正确的方法并与正确的类对象实例相关联,但在实际从事件队列调用之前,不会对#此处的某物#进行求值(无论它是变量还是其他函数)。而不是传入要调用的函数
func1
以及应传递给该函数的参数,传入一个函数func2
,该函数使用应传入的参数调用func1
d = {"a":1}
def p(val):
print val
def func1():
p(d["a"])
def call_it(func):
func()
call_it(func1)
d["a"] = 111
call_it(func1)
在func1
中,在实际执行func1
之前,不会计算d[“a”]
出于您的目的,您的队列将更改为:
class EventQueue(object):
def __init__(self):
self.events = deque()
def push(self, callable):
self.events.append(callable)
def process_next(self):
self.events.popleft()()
collections.deque
从队列前面弹出的速度比列表快
要使用EventQueue
,可以使用lambdas实现快速匿名功能
events2 = EventQueue()
foo1 = Foo(4)
bar1 = Bar(4, 2)
events2.push(lambda: foo1.update_value(1.5))
events2.push(lambda: bar1.print_alt_value(foo1.value))
events2.push(lambda: bar1.print_alt_value(foo1.return_bah()))
events2.process_next()
events2.process_next() # 36.0
events2.process_next() # 54.0
用于编辑:
在这种情况下,您需要“捕获”变量中的值,该变量的作用域比循环的作用域更紧密。你可以使用一个普通的函数来实现这一点
for name in names_list:
def update(name):
names_objs[name].update_value(2)
events2.push(partial(update, name))
我在最初的问题中澄清了一些,如果你能帮忙澄清,或者让我知道我想要的是不是不合理的。谢谢