我正在创建一个游戏,它具有键盘事件和一个事件系统,可以在其上注册功能,并且需要返回两个列表(任意大小):游戏时间事件列表和真实列表时间事件(按此顺序)。赛事主办方随后将
我正在重构代码以执行此操作。在以前的系统中,事件会手动将它们的事件与主游戏时间/实时事件队列合并。
我正在尝试重构在按下/释放键时触发所有事件的代码。当前代码:
class KeyReleaseEventRunner
GameEvents = []
RealEvents = []
def __call__(self):
"""Run all relevant events."""
# Run key-specific key release events
KeyReleaseEvent[self.key]()
# Run key-specific key toggle events
KeyToggleEvent[self.key](False)
# Run generic key release events
KeyReleaseEvent(self.key)
# Run generic key toggle events
KeyToggleEvent(self.key, False)
我的问题是如何合并这些函数中的所有事件。
有没有更简单易读的方法来做到这一点?:
def __call__(self):
"""Run all relevant events."""
# Run key-specific key release events
g_events, r_events = KeyReleaseEvent[self.key]()
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Run key-specific key toggle events
g_events, r_events = KeyToggleEvent[self.key](False)
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Run generic key release events
g_events, r_events = KeyReleaseEvent(self.key)
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Run generic key toggle events
g_events, r_events = KeyToggleEvent(self.key, False)
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Events must maintain sorted-ness
self.GameEvents.sort()
self.RealEvents.sort()
我不想在 KeyReleaseEventRunner 上创建方法(这种情况在其他几个地方,并且经常使用局部变量而不是 GameEvents/RealEvents)。
更一般地说,让这些函数返回两个列表是否有更好的解决方案?
可以区分 g_events 和 r_events 中的事件。
编辑:
为了消除关于对象既可调用又可索引的任何混淆:
可能值得注意的是,实例Event
是注册函数的接口,调用时会调用所有注册的对象。 KeyToggleEvent
和KeyReleaseEvent
(and also KeyPressEvent
) 是 的子类的实例Event
,其他模块可以通过它注册键特定事件(通过注册到KeyReleaseEvent[key]
)和非键特定事件(通过注册到KeyReleaseEvent
)。