如何声明一个带内联函数的字典

20 投票
7 回答
27654 浏览
提问于 2025-04-17 10:15

我需要在使用一个函数作为字典的元素之前,先正式定义这个函数吗?

def my_func():
  print 'my_func'

d = {
  'function': my_func
}

我更想直接在里面定义这个函数。我刚试着把我想做的事情写出来,但Python的空格规则让我很难在字典里直接定义一个函数。有没有什么办法可以做到这一点?

7 个回答

7

你可以使用装饰器

func_dict = {}

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

@register
def a_func():
    pass

@register
def b_func():
    pass

func_dict 最终会用函数的完整名称来进行映射:

>>> func_dict
{'a_func': <function a_func at 0x000001F6117BC950>, 'b_func': <function b_func at 0x000001F6117BC8C8>}

你可以根据需要修改register使用的键。关键在于我们使用函数的__name__属性来获取合适的字符串。

9

你真的需要一个字典吗,还是只需要用getitem来访问数据?

如果你只需要后者,那就可以使用一个类:

>>> class Dispatch(object):
...     def funcA(self, *args):
...         print('funcA%r' % (args,))
...     def funcB(self, *args):
...         print('funcB%r' % (args,))
...     def __getitem__(self, name):
...         return getattr(self, name)
... 
>>> d = Dispatch()
>>> 
>>> d['funcA'](1, 2, 3)
funcA(1, 2, 3)
30

这个回答的意思是,在Python中,不能在字典定义的同时直接声明一个函数。感谢所有花时间来参与讨论的人。

撰写回答