在Python中将参数指定为None时,有什么方法可以让函数使用其参数的默认值?

时间:2015-02-26 08:55:27

标签: python function default-arguments

假设我有一个函数(称为function),它接受一个默认值为True的布尔参数,如def function(argument1 = True)

现在让我们说我想使用这个函数,使用另一个函数(resolveArg)的输出来指定它的参数,该函数检查现有基础结构中的参数。通常使用此resolveArg方法,如果它可以找到目标为给定函数的参数值(例如function),则它将函数参数设置为它,否则它将参数设置为{{1 }}。

如果None的参数由其他函数(function)设置为None,我怎样才能使用其参数的默认值?

resolveArg

4 个答案:

答案 0 :(得分:1)

我之前没有见过这种问题,所以可能有办法改善你的逻辑并省略这个功能。

然而,有一种方法可以使用模块"inspect"对Python中的代码进行内省。

示例用法是:

>>> def a(q=5):
...  if q is None:
...   return dict(inspect.getmembers(a))['func_defaults'][0]
...  return q
...
>>> a()
5
>>> a(None)
5

问题在于" func_defaults"返回一个列表,如果你有多个参数函数并且整体上使程序容易出错,那么这个列表是不方便的。

答案 1 :(得分:1)

<强> 买者

当Python中将参数指定为None时,你问了一个让函数使用其参数默认值的好方法吗?&#34;

我认为没有 良好的 方式,因为这不是一件好事。这是一个冒险的事情 - 它可以掩盖令人讨厌的错误情况,您可能有理由想要检测{I}在您期望值的位置传递的事实。调试广泛使用这种技术的地方可能很糟糕。 极其谨慎使用。

可能的方法

我猜你想要一个通用的解决方案,它比你提供的功能更多的功能作为例子。在示例中 - 您最简单的方法是在参数值中测试None并在必要时替换它。

您可以编写一个装饰器来执行一般情况,它将使用inspect工具箱在默认值的参数列表中计算出参数值,如果它们是None则替换它们。

下面的代码用一些简单的测试用例演示了这个想法 - 这将起作用,但仅适用于当前构成的具有简单参数(不是None)的函数。可以加强它以涵盖这些案件。它像往常一样安全地处理没有默认值的参数。

Python Fiddle

*args, **kwargs

答案 2 :(得分:0)

如果参数为functionTrue,则一种方法是向None提供相同的行为。

def function(arg=True):
    if arg in [True, None]:
        do_stuff()
    else:
        do_something_else()

答案 3 :(得分:0)

您可能希望稍微修改function的实施,如下所示:

def function(argument1 = None)
    if argument1 is None:
       argument1 = True        

    return argument1

如果您想进一步了解默认函数参数为None,您可能需要参考我的其他SO answer