执行子功能的主功能

Master function that executes subfunctions

我有两个接受不同参数的函数:

def foo(name, age):
    pass
def bar(color, shape):
    pass

现在,我有一个主函数,我希望能够使用我要执行的函数及其参数来调用它。由于它是一个可能调用 foo 或 bar 的主函数,因此它仅使用两个参数调用(要执行的函数和该函数的参数。

function 是一个字符串,告诉要执行什么函数

params 将是一个参数字典(如 **kwargs)

我可以这样做来让它工作:

def master(function, params):
    if function == 'foo':
        foo(params['name'], params['age'])
    elif function == 'bar':
        foo(params['color'], params['shape'])

然后我这样称呼主人:

master('foo',{'name': 'John', 'age': 99})

但是,如果 master 有很多子函数要调用,则条件和为每个函数选择正确参数的条件太多。

所以我基本上有两个问题:

1) 不是用函数名调用master,然后在条件中检查这个名字,我可以直接传递要执行的函数吗?如果是这样,我该如何执行该功能?

有点像这样称呼主人:

master(foo(), {'name': 'John', 'age': 99})

2) 函数 foobar 没有 **kwargs,但是如果我可以调用它们只传递一个字典然后它们将它们分配给每个变量,那将是非常方便的来自字典的相应值。

基本上,我可以这样做吗:

params = {'name':'John', 'age':99, 'color':red, 'shape':circle}
foo(params)  # I would like to to this even if foo doesn't have **kwargs
bar(params)  # same for bar

所以最后我理想中的主人称呼是:

params = {'name':'John', 'age':99, 'color':red, 'shape':circle}

master(foo(), params) # to execute foo
master(bar(), params) # to execute bar

python中的函数是对象,所以是的,您可以将它们作为参数传递(但不要使用括号)。

def master(function, **kwargs):
    function(params, kwargs)

那你叫师傅:

master(foo, name='John', age=99...)

您可以将函数作为参数传递:

def master(func, arguments: dict):
    if func is foo:
        args = arguments["name"], arguments["age"]
    elif func is bar:
        args = arguments["color"], arguments["shape"]

    return func(*args)

如果您不知道函数参数的名称,这可以更简单地完成:

def master(func, arguments: list):
    return func(*arguments)

更通用的版本如下:

def master(function, *positional_arguments, **keyword_arguments):
    function(*positional_arguments, **keyword_arguments)

master(foo, 'John', 56)
master(foo, **{'name': 'John', 'age': 56})
master(foo, name='John', age=56)
master(foo, *['John', 56])

您可以通过 master 函数执行函数,而不是通过将函数作为参数传递到 master 内部,而是通过传递函数的定义。请按照以下示例操作:

   def foo(name, age):
      pass

   def bar(color, shape):
      pass

现在考虑一个主函数:

Func param 会包含函数的定义,在函数名后加上括号,它会执行。

def masterFunc(func, params):
     return func(params)  #  Func param will contain the defination of the function by adding parentheses after function name, it will make it to execute. 

您将使用此主函数来执行传递的函数定义,如下所示:

masterFunc(foo,{a:1}) #Sample execution

在 Python 中,函数是对象,就像其他所有东西一样。您可以将函数作为参数传递并非常简单地执行它们。

在你的情况下,

 def say_hello(name):
   print "hi ", name

 def say_bye(name, time):
   print name, ", have a good ", time

 say_bye("john", "night")
 john , have a good  night

 def master(fun, **kwargs):
   fun(**kwargs)

 master(say_bye, name='john', time='night')
 john , have a good  night

 params1 = {'name': 'jay', 'time': 'morning'}
 params2 = {'name': 'cole'}

 master(say_hello, **params2)
 hi  cole

 master(say_bye, **params1)
 jay , have a good  morning

这应该有效。

函数第一个-class对象在Python,因此可以分配给标识符,作为参数传递或由函数返回。

您不想为特定函数打扰关键字参数的统一方式 - 具有 inspect.getfullargspec 功能:

import inspect

def foo(name, age):
    print(name, age)

def bar(color, shape):
    print(color, shape)

def master(func, params):
    arg_names = inspect.getfullargspec(func).args
    func(**{k:v for k,v in params.items() if k in arg_names})

params = {'name':'John', 'age':99, 'color':'red', 'shape':'circle'}
master(foo, params)
master(bar, params)

示例输出:

John 99
red circle

您可以尝试以下方法。

代码

class A:
    def a(self, *args, **kwargs):
        print('A')

    def b(self, *args, **kwargs):
        print('B', args, kwargs)

def main(func, *args, **kwargs):
    x = A()
    if hasattr(x, func):
        func = getattr(x, func)
        func(*args, **kwargs)
    else:
        print('No function name {} defined under class'.format(func))


if __name__ == '__main__':
    func = raw_input('Func_name: a/b')
    main(func, (1), {1:1})

输出

~/del$ python test.py 
Func_name: a/ba
True
A
~/del$ python test.py 
Func_name: a/bb
True
('B', (1, {1: 1}), {})
~/del$

在这里,我们在 __builtin__ 中使用 getattr 函数。
* 首先检查class A的实例下是否有名为ab的function/method。 * 如果是,那么只有它会 getattr 从它并执行传递 args 和 kwargs。 * 如果有人传递未定义的函数名称,它不会崩溃并且 return 在那里说出必要的声明。

希望对您有所帮助!