通过dict调用函数时不传递任何参数

nim*_*ims 15 python

我制作了一个Python脚本,它根据用户的输入调用函数.到现在为止,我只是通过一个字典来调用无参数函数

options = { 0 : func0,
            1 : func1,
            2 : func2,
           }
options[choice]()
Run Code Online (Sandbox Code Playgroud)

现在我处于需要使用参数调用一些函数的情况.我是Python的新手,我尝试过这样的东西

options = { 0 : (func0,None),
            1 : (func1,None),
            2 : (func2,foo1),
            3 : (func3,foo2),
          }
options[choice][0](options[choice][1])
Run Code Online (Sandbox Code Playgroud)

我知道为什么None在这里不起作用,并且只是为了表示该函数不带任何参数而编写它.我应该在代码中做出哪些更改,以便它适用于各种功能?

我试过拆包empty dict但它也不起作用.

Joh*_*ooy 26

None仍然是一个值,并将它传递给一个不期望参数的函数将无法正常工作.而是考虑partial在这里使用

from functools import partial

options = { 0: func0,
            1: func1,
            2: partial(func2, foo1),
            3: partial(func3, foo2),
          }

options[choice]()
Run Code Online (Sandbox Code Playgroud)


pha*_*t0m 18

使用参数列表:

options = { 0 : (func0, []),
            1 : (func1, []),
            2 : (func2, [foo1]),
            3 : (func3, [foo2]),
          }
options[choice][0](*options[choice][1])
# or
func, args = options[choice]
func(*args)
Run Code Online (Sandbox Code Playgroud)

如果您希望能够指定命名参数,可以像这样扩展它:

options = { 0 : (func0, [], {}),
            1 : (func1, [], {param_name: value}),
            2 : (print_name, [], {name: "nims"}),
            3 : (func3, [foo2], {}),
          }
func, args, kwargs = options[choice]
func(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • @nims:请注意,你可以非常自然地在gnibbler的解决方案中做到这一点:`partial(func,foo1,p_name = foo2)` (3认同)
  • @jamylak:哦,谢谢编辑,现在这是一个解包失败:) (2认同)