首页 文章

是否有一种狡猾的方法来调用一个函数,该函数又调用具有不同数量和类型的参数的多个函数?

提问于
浏览
-2

在Python 2.7中,我有几个我无法修改的函数,只是使用 . 其中三个是“前”,其中三个是“后”;让我们称它们为f1(),f2(),f3(),r1(),r2(),r3() . 我还有17个具有不同名称关键字的不同数量和类型参数的函数,例如:

function01( par1='hello' , par2=847, par3=True , par4=17.821 , ........... )
function02( par43=(8.3+17.9i) , par21='august' )

等等 .

我需要以这种方式将它们全部称为17:

f1()
f2()
f3()
functionNN(............................)
r1()
r2()
r3()

那段代码17次(NN = 1到17)!

没有写出17块,有没有一种狡猾的方法呢?

***添加信息...我现在拥有的是一个可怕的代码:

#block1
f1()
f2()
f3()
function01( par1=..., par2=..., par3=..., par4=...................)
r1()
r2()
r3()

#block2
f1()
f2()
f3()
function02( par43=..., par21=...)
r1()
r2()
r3()

#block3
f1()
f2()
f3()
function03( par17=..., par37=..., par11=...)
r1()
r2()
r3()

#block4
.......
.......
.......
.......
.......
#block17
.......

17个函数中有一个具有“无名”参数 . :-S

6 回答

  • 0

    您也可以像这样使用 globlas()

    for i in range(1, 18):
        f1()
        f2()
        f3()
        globals()['function' + str(i).zfill(2)]() # pass the par here, but I dont know the rules
        r1()
        r2()
        r3()
    

    globals() 返回一个dict,该函数在globals范围内将是一个可访问的dict形式 . 有关 globals() 阅读Here的更多信息 .

  • 0

    看看contextlib module . 很基本的例子

    from contextlib import ContextDecorator
    
    def front1():
        print('print from front1')
    
    def front2():
        print('print from front2')
    
    def front3():
        print('print from front3')
    
    
    def rear1():
        print('print from rear1')
    
    def rear2():
        print('print from rear2')
    
    def rear3():
        print('print from rear3')
    
    class mycontext(ContextDecorator):
        def __enter__(self):
            front1()
            front2()
            front3()
            return self
    
        def __exit__(self, *exc):
            rear1()
            rear2()
            rear3()
            return False
    
    @mycontext()
    def foo():
        print('print from foo')
    
    @mycontext()
    def bar():
        print('print from bar')
    
    if __name__ == '__main__':
        foo()
        bar()
    
        # or as alternative
        # my_funcs = [foo, bar]
        # for func in my_funcs:
            # func()
    

    产量

    print from front1
    print from front2
    print from front3
    print from foo
    print from rear1
    print from rear2
    print from rear3
    print from front1
    print from front2
    print from front3
    print from bar
    print from rear1
    print from rear2
    print from rear3
    
  • 0

    列出包含函数及其参数的列表:

    ff=[ [function01, [10,20,"something"],  dict(par1='hello', par2=847, par3=True, par4=17.821)],
         [function02, [],                   dict(par43=(8.3+17.9i), par21='august')],
         [function03, [1,2,"hello"],        {}],
         ...
        ]
    
    for  i in range(17):
            f1()
            f2()
            f3()
    
            posargs=ff[i][1]        # positional args
            kw=ff[i][2]             # keyword args for function_i
            ff[i][0](*posargs,**kw) # calling function_i
    
            r1()
            r2()
            r3()
    

    您也可以稍后更改参数 . 例如:

    ff[1][2]["par21"]="december"
    
    new_kw_func02= dict(par43=(1+2i), par21='december'])
    ff[1][2]= new_kw_func02
    
    new_pargs_func03=[10,20,"World"]
    ff[2][1]= new_pargs_func03
    
  • 0

    函数就像对象一样,你可以将em全部打包到列表中并从中调用它们 .

    例如:

    def fun0():
        print(0)
    
    def fun1():
        print(1)
    
    def fun2():
        print(2)
    
    def fun3():
        print(3)
    
    funlist = [fun0, fun1, fun2, fun3]
    
    for fun in funlist:
        fun()
    

    在你的情况下,你还需要打包参数,所以你必须使用这样的东西:

    N = 4 
    
    funlist = [fun0, fun1, fun2, fun3]
    
    paramlist = [[params0], [params1], [params2], [params3]]
    
    for i in range(4):
        funlist[i](*paramlist[i])
    
  • 0

    由于函数接受不同的参数,因此您必须将它们一起写入其中,并且至少应该使用它们各自的参数 . 但是你可以在那个块之外的某个地方做到这一点,以便在包装函数或列表中获得更好的可读性 .

    例如:

    fn_list = [function01, function02...]
    [fn() for fn in fn_list]
    

    要么

    def wrapping_func(args_list): (or use *args, **kwargs syntax)
        function01(args_list[0])
        function02(args_list[1])
    
  • 0

    为什么不使用循环,如下所示:

    for i in range(17):
        f1()
        f2()
        ....
    

相关问题