gpt4 book ai didi

编写包装函数的 Pythonic 方式

转载 作者:太空狗 更新时间:2023-10-30 02:16:17 24 4
gpt4 key购买 nike

假设我有一个函数 foo 可以获取一些参数

def foo(width, height, depth=0):
...

我想写一个包装函数来获取所有 foo 的参数并传递它们,例如

def goo(width, height, depth=0):
...
foo(width, height, depth)
...

但这很丑陋,因为我必须重复变量的默认值。

在 python 中执行此操作的惯用方法是什么?

我想到的几个选项:

  1. goo 传递一个名为 foo_params 的字典并调用 foo(**foo_params) 但随后很容易出错,因为我不不知道如果所有参数都存在

  2. 为 foo 编写另一个包装器,检查具有默认值的参数是否为 None,如果是则不传递它们

  3. 将默认值作为常量,这样我就不再重复了

最佳答案

您可以使用 *args**kwargs 语法来传递未知数量的参数和/或关键字参数:

>>> def dec(func):
def inner(*args, **kwargs):
print('decorated function')
func(*args, **kwargs)
return inner

>>> @dec
def func(a, b):
return a + b

>>> func(1, 2)
decorated function
>>>

使用 *args**kwargs 的一个缺点是您将丢失装饰函数的原始函数签名。例如:

>>> help(func)
Help on function inner in module __main__:

inner(*args, **kwargs)

>>>

解决方案是使用functools.wraps() .它基本上将数据从装饰函数复制到包装函数:

>>> from functools import wraps
>>>
>>> def dec(func):
@wraps(func)
def inner(*args, **kwargs):
print('decorated function')
func(*args, **kwargs)
return inner

>>> @dec
def func(a, b):
return a + b

>>> func(1, 2)
decorated function
>>>

您可以在下面看到,如果您现在执行 help(func),将显示 func 的原始签名:

>>> help(func)
Help on function func in module __main__:

func(a, b)

>>>

关于编写包装函数的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45027667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com