从其他函数继承默认值的函数参数

2024-10-01 04:46:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

然后在另一个模块中有另一个函数调用它

^{pr2}$

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

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

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

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


Tags: 模块函数none参数returndeftransformsome
3条回答

你的问题不够清楚。但据我从您的问题中了解,您应该使用class,这样您就可以轻松地在类内的多个函数之间共享值

class SomeClass:

  def __init__(self, b='defaultvalue'):
    self.b = b

  def some_func(self, a, b):
    pass

  def wrapper(self, a):
    self.some_func(a, self.b)

您可以使用argument unpacking来完成此操作:

In [1]: def some_func(a,b='myDefaultValue'):
   ...:     print a, b
   ...:

In [2]: def wrapper(a, *args, **kwargs):
   ...:     some_func(a, *args, **kwargs)
   ...:

In [3]: some_func('foo', 'bar')
foo bar

In [4]: some_func('baz')
baz myDefaultValue

In [5]: wrapper('foo', 'bar')
foo bar

In [6]: wrapper('baz')
baz myDefaultValue

如果计划以这种方式包装多个函数,可以考虑将wrapperadecorator

^{pr2}$

您可以使用函数默认值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)

输出:

^{pr2}$

编辑:要从注释中回答您的问题,没有任何内置功能可以按名称查找带有默认值的函数的参数。但是,您知道具有默认值的参数必须位于非可选参数之后。因此,如果你知道你拥有的参数的总数,以及其中有多少参数有默认值,你可以减去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).

相关问题 更多 >