微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中使用字符串作为函数句柄

如何解决在Python中使用字符串作为函数句柄

我目前正在用python编写我自己的事件处理系统。我允许用户使用函数为每个事件分配回调:
myEventHandlingSystem.addCallback(event_name,event_callback)

但是,由于每个客户端都有一组事件,因此有时支持的事件列表将非常长。在这种情况下,使用上述方法手动添加每个事件会非常复杂,并且可能还会出现一些错误,例如忘记分配事件或错误地使用不同的回调多次分配了事件。

我要实现的是,由于每个事件都有一个字符串名称,因此用户应使用与事件完全相同的名称定义回调。因此,最后,用户只需要提供一个事件列表,每个回调将自动与该事件相关联(当然,以其他方式命名的回调,该事件将不分配任何内容),例如:>

SUPPORTED_EVENT1 = 'evt_Event1'
SUPPORTED_EVENT2 = 'evt_Event2'

clientConfig = json.load(configHandle)
# the json config file contains a field of 'SupportedEventList':[SUPPRTED_EVENT1,...]


def evt_Event1(*args):
    ...

myEventHandlingSystem.addCallbackFromEventList(clientConfig['SupportedEventList'])

请注意,supportedEventList始终以字符串列表的形式出现,其中每个元素都是包含Event名称的字符串。回调也处理在定义myEventHandlingSystem类的文件

解决方法

对此的一种解决方案是在函数及其名称之间建立具有关联的dict。请记住,函数是python中的一流对象,因此您可以将它们存储在dict中,就像可以存储对任何其他数据的引用一样。因此,您可以按照以下方式进行操作:


def evt_Event1(*args):
    ...

ALLOWED_CALLBACKS = {"evt_Event1": evt_Event1}

supportedEventList = ["evt_Event1",...]

for event in supportedEventList:
  myEventHandlingSystem.addCallback(event,ALLOWED_CALLBACKS[event])

编辑:所以要解决目前的问题。 python中有一个名为globals()的函数,该函数具有给定python文件中定义的函数的列表,即{"evt_Event1":<function at ...>}

您可以这样做:

SUPPORTED_EVENT1 = 'evt_Event1'
SUPPORTED_EVENT2 = 'evt_Event2'

clientConfig = json.load(configHandle)
# the json config file contains a field of 'SupportedEventList':[SUPPRTED_EVENT1,...]


def evt_Event1(*args):
    ...

GLOBALS = globals()
for callback_name in clientConfig['SupportedEventList']:
 eventSystem.addCallback(GLOBALS[callback_name])

如果您想要一个寄存器类型的API。你可以: 因此,您可以按照以下方式进行操作:

# ./decorator.py

REGISTERED = {}

def register(func):
     REGISTERED[func.__name__] = func
     return func

和主代码中

from .decorator import REGISTERED,register

@register
def callback():
    ...

或者,您可以使用这种类型的装饰器直接将新的回调注册到事件处理系统中:

def register(func):
    myEventHandlingSystem.addCallback(func.__name__,func)
    return func

您还可以查看pluggy和类似的插件框架,这些框架使人们可以添加适合您的模式的插件功能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。