Python:在模块之间传递函数名称作为参数
Python: Passing a function name as an argument between modules
版本
Python 3.4 和 Pygame1.9.2
问题
如何将 function/method 的名称从一个不存在此函数的模块传递到包含它的模块,而不必求助于将其设为字符串并通过 eval() 对其进行评估?
背景
我有一个用于训练目的的简单 MVC 模式。为了简单起见,我们假设我们按下了菜单中的一个按钮。这是发生了什么:
控制器将我们的事件,即作为 ClickEvent 的单击(包含位置、鼠标按钮以及按钮是否被按下或释放)发送到当前运行的逻辑菜单。菜单然后根据点击的位置评估点击,如果点击发生在按钮上,它 returns 包含模型方法名称的 ModelEvent。然后模型接收所述 ModelEvent 并对其进行评估。如果发生任何可见的变化,它会创建一个新的 ViewEvent(这超出了我的问题范围)。
方法
到目前为止,我通过三种方式解决了这个问题,一次是通过 lambda(它似乎根本不符合我的需要,或者我严重误解了它),两次是通过将字符串与 eval() 结合使用。后一种方法的缺点很明显:函数的名称必须作为字符串在实例之间传递,然后由 eval() 进行评估,这需要时间。
将方法和函数的名称从一个模块(它们不存在)传递到另一个模块(它们将被执行)而不必使用字符串和 eval() 的有效方法是什么?
或者,如果您发现我的一般方法有任何严重错误,我很乐意听到,因为我还在学习。
当我理解正确时,你将回调与 Events.Perhaps 混合在一起,这使得问题变得如此棘手。
在 Python 中,函数是对象,可以像字符串一样作为任何其他对象传递。因此无需传递名称并对其进行评估。
版本
Python 3.4 和 Pygame1.9.2
问题
如何将 function/method 的名称从一个不存在此函数的模块传递到包含它的模块,而不必求助于将其设为字符串并通过 eval() 对其进行评估?
背景
我有一个用于训练目的的简单 MVC 模式。为了简单起见,我们假设我们按下了菜单中的一个按钮。这是发生了什么:
控制器将我们的事件,即作为 ClickEvent 的单击(包含位置、鼠标按钮以及按钮是否被按下或释放)发送到当前运行的逻辑菜单。菜单然后根据点击的位置评估点击,如果点击发生在按钮上,它 returns 包含模型方法名称的 ModelEvent。然后模型接收所述 ModelEvent 并对其进行评估。如果发生任何可见的变化,它会创建一个新的 ViewEvent(这超出了我的问题范围)。
方法
到目前为止,我通过三种方式解决了这个问题,一次是通过 lambda(它似乎根本不符合我的需要,或者我严重误解了它),两次是通过将字符串与 eval() 结合使用。后一种方法的缺点很明显:函数的名称必须作为字符串在实例之间传递,然后由 eval() 进行评估,这需要时间。
将方法和函数的名称从一个模块(它们不存在)传递到另一个模块(它们将被执行)而不必使用字符串和 eval() 的有效方法是什么?
或者,如果您发现我的一般方法有任何严重错误,我很乐意听到,因为我还在学习。
当我理解正确时,你将回调与 Events.Perhaps 混合在一起,这使得问题变得如此棘手。
在 Python 中,函数是对象,可以像字符串一样作为任何其他对象传递。因此无需传递名称并对其进行评估。