Python中將函數作為另一個函數的參數傳入並調用


在Python中,函數本身也是對象,所以可以將函數作為參數傳入另一函數並進行調用

在舊版本中,可以使用apply(function, *args, **kwargs)進行調用,但是在新版本中已經移除,以function(*args, **kwargs)進行替代,所以也不應該再使用apply方法

示例代碼:

def func_a(func, *args, **kwargs):
    print(func(*args, **kwargs))

def func_b(*args):
    return args

if __name__ == '__main__':
    func_a(func_b, 1, 2, 3)

在代碼中,將函數func_b作為函數func_a的參數傳入,將函數func_b的參數以元組args傳入,並在調用func_b時,作為func_b的參數。

運行結果:

(1, 2, 3)

 

但是這里存在一個問題,但func_a和func_b需要同名的參數時,就會出現異常,如:

def func_a(arg_a, func, **kwargs):
    print(arg_a)
    print(func(**kwargs))

def func_b(arg_a):
    print(arg_a)

if __name__ == '__main__':
    func_a(arg_a='Hello Python', func=func_b)

異常信息:

TypeError: func_b() missing 1 required positional argument: 'arg_a'

 

雖然通過修改,手動將arg_a作為參數傳入func中進行調用,可以正常運行,但這明顯不符合設計初衷:在func_a中執行func(**kwargs)時,很可能並不知道func到底需要什么參數。換句話說,如果已經提前知道需要調用什么函數,那完全不必要把函數作為參數傳入另一個函數並調用,直接調用函數即可。

def func_a(arg_a, func, **kwargs):
    print(arg_a)
    func(arg_a=arg_a, **kwargs)

def func_b(arg_a):
    print(arg_a)

if __name__ == '__main__':
    func_a(arg_a='Hello Python', func=func_b)

當加入第三個函數,func_c,它不需要arg_a這個參數時,就會出現問題。

def func_a(arg_a, func, **kwargs):
    print(arg_a)
    func(arg_a=arg_a, **kwargs)

def func_b(arg_a):
    print(arg_a)

def func_c():
    print('Hello World')

if __name__ == '__main__':
    func_a(arg_a='Hello Python', func=func_b)
    func_a(arg_a='Hello Python', func=func_c)

異常結果:

TypeError: func_c() got an unexpected keyword argument 'arg_a'

 

目前想到的解決辦法是盡量避免func_a存在跟其他函數相同的參數,比如把func_a的arg_a參數改成func_a_arg_a。

def func_a(func_a_arg_a, func, **kwargs):
    print(func_a_arg_a)
    func(**kwargs)

def func_b(arg_a):
    print(arg_a)

def func_c():
    print('Hello World')

if __name__ == '__main__':
    func_a(func_a_arg_a='temp', arg_a='Hello Python', func=func_b)
    func_a(func_a_arg_a='temp', func=func_c)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM