如何使用内联函数声明字典

Mat*_*lor 9 python

在将其用作字典元素之前,是否必须正式定义函数?

def my_func():
  print 'my_func'

d = {
  'function': my_func
}
Run Code Online (Sandbox Code Playgroud)

我宁愿定义内联函数.我只是尝试输入我想要做的事情,但是python语法的空白策略使得在dict中定义内联函数变得非常困难.有没有办法做到这一点?

Mat*_*lor 16

答案似乎是没有办法在python中声明函数内联字典定义.感谢所有花时间做出贡献的人.

  • 这是最正确的答案.虽然很高兴知道在Python中用五种左右的方法来做类似的事情,但是除了lambda之外,没有办法在Javascript中使用除了lambda之外的匿名函数这么简单,这些函数仅限于可以放在一行上的简单函数. (2认同)
  • 同意 JavaScript 正确地完成了这部分,声明一些函数与包含它们的对象内联是非常容易和可读的 (2认同)

ekh*_*oro 8

你真的需要一本字典,还是只需要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)
Run Code Online (Sandbox Code Playgroud)


qia*_*iao 5

考虑使用 lambda,但请注意 lambda 只能包含一个表达式,并且不能包含语句(请参阅http://docs.python.org/reference/expressions.html#lambda)。

例如

d = { 'func': lambda x: x + 1 }
# call d['func'](2) will return 3
Run Code Online (Sandbox Code Playgroud)

另请注意,在 Python 2 中,print不是函数。所以你必须这样做:

from __future__ import print_function

d = {
    'function': print
}
Run Code Online (Sandbox Code Playgroud)

sys.stdout.write改用

d = {
    'function': sys.stdout.write
}
Run Code Online (Sandbox Code Playgroud)


Kar*_*tel 5

您可以使用装饰器

func_dict = {}

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

@register
def a_func():
    pass

@register
def b_func():
    pass
Run Code Online (Sandbox Code Playgroud)

func_dict最终将使用功能的完整名称映射:

>>> func_dict
{'a_func': <function a_func at 0x000001F6117BC950>, 'b_func': <function b_func at 0x000001F6117BC8C8>}
Run Code Online (Sandbox Code Playgroud)

您可以register根据需要修改使用的密钥。诀窍是我们使用__name__函数的属性来获取适当的字符串。