gpt4 book ai didi

python - 函数参数从其他函数继承默认值

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:29 27 4
gpt4 key购买 nike

假设 Python 库中有一个函数(我们称它为 mymodule):

def some_func(a,b='myDefaultValue'):
return some_computation

然后另一个模块中的另一个函数调用它,

import mymodule
def wrapper(a,b):
return some_transform(mymodule.some_func(a,b))

如何使 wrapper 继承 some_funcb 参数默认值?我可以做类似的事情:

def wrapper(a,b=None):
if b:
return some_transform(some_func(a,b))
else:
return some_transform(some_func(a))

但这似乎不必要地麻烦,导致具有多个可选参数的可能性的组合爆炸,并且使得我无法显式地将 None 传递给 wrapper

有没有办法获取函数的默认参数,或者通常的做法是将该值简单地提取到两个函数声明都可以使用的共享常量中?

最佳答案

您可以使用func_defaults: https://docs.python.org/2/library/inspect.html?highlight=func_defaults#types-and-members

func_defaults tuple of any default values for arguments

def some_func(a,b='myDefaultValue'):
print a, b

def wrapper(a,b):
b = some_func.func_defaults[0] if b is None else b
some_func(a,b)


print "b is 'there'"
a = "hello"
b = "there"
wrapper(a,b)

print "b is 'None'"
b = None
wrapper(a,b)

输出:

b is 'there'
hello there
b is 'None'
hello myDefaultValue

编辑:为了从评论中回答您的问题,没有任何内置功能可以按名称查找具有默认值的函数的参数。但是,您知 Prop 有默认值的参数必须位于非可选参数之后。因此,如果您知道您拥有的参数总数,以及其中有多少具有默认值,则可以减去 2 以获得具有默认值的参数的起点。然后您可以将参数列表(从先前计算的参数索引开始)与默认参数值列表一起压缩,并从列表中创建一个字典。使用 inspect模块以获取您需要的所有信息:

像这样:

>>> import inspect
>>> def some_func(a,b,c,d="dee",e="ee"):
... print a,b,c,d,e
...
>>> some_func("aaa","bbb","ccc",e="EEE")
aaa bbb ccc dee EEE
>>> some_funcspec = inspect.getargspec(some_func)
>>> some_funcspec
ArgSpec(args=['a', 'b', 'c', 'd', 'e'], varargs=None, keywords=None, defaults=('dee', 'ee'))
>>> defargsstartindex = len(some_funcspec.args) - len(some_funcspec.defaults)
>>> defargsstartindex
3
>>> namedargsdict = dict(zip([key for key in some_funcspec.args[defargsstartindex:]], list(some_funcspec.defaults)))
>>> namedargsdict
{'e': 'ee', 'd': 'dee'}

在上面的示例中,namedargsdict 是带有 some_func 默认值的参数列表。

进一步阅读:

https://docs.python.org/2/library/inspect.html#inspect.getargspec

inspect.getargspec(func) Get the names and default values of a Python function’s arguments. A tuple of four things is returned: (args, varargs, keywords, defaults). args is a list of the argument names (it may contain nested lists). varargs and keywords are the names of the * and ** arguments or None. defaults is a tuple of default argument values or None if there are no default arguments; if this tuple has n elements, they correspond to the last n elements listed in args.

Changed in version 2.6: Returns a named tuple ArgSpec(args, varargs, keywords, defaults).

关于python - 函数参数从其他函数继承默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32061589/

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