python - 当参数在 Python 中指定为 None 时,让函数使用参数的默认值的好方法是什么?

标签 python function default-arguments

假设我有一个函数(称为 function ),它接受一个 bool 参数,默认值为 True喜欢 def function(argument1 = True) .

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

我怎样才能得到function如果其参数设置为None,则使用其参数的默认值通过这个其他函数(resolveArg)?

def resolveArg(argName = None):
    if argName in self.conf._argdict:
        return(self.conf._argdict[argName].value)
    else:
        return(None)

def function(argument1 = True)
    if argument1 is True:
        return(True)
    elif argument1 is False:
        return(False)
    else:
        raise(Exception)

function(argument1 = resolveArg("red"))

最佳答案

警告

您询问“当参数在 Python 中指定为 None 时,让函数使用参数的默认值的好方法?”

我认为没有好的方法,因为这不是一件好事。这是一件有风险的事情 - 它可能会掩盖令人讨厌的错误情况,您可能有理由希望检测到在您期望的值中传递了 None 的事实。在广泛使用这种技术的地方进行调试可能会很糟糕。 使用时要格外小心。

可能的方法

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

您可以编写一个装饰器来执行一般情况,它将使用检查工具箱计算出具有默认值的参数列表中的参数值,并在它们为“无”时替换它们。

下面的代码通过一些简单的测试用例演示了这个想法 - 这将起作用,但仅适用于当前构成的具有简单参数(不是 *args,**kwargs)的函数。可以对其进行增强以涵盖这些情况。它像往常一样安全地处理没有默认值的参数。

Python Fiddle

import inspect

def none2defaultdecorator(thisfunc):
    (specargs, _, _, defaults) = inspect.getargspec(thisfunc)

    def wrappedfunc(*instargs):        
        callargs = inspect.getcallargs(thisfunc, *instargs)

        if len(specargs) != len(callargs):
             print "Strange - different argument count in this call to those in spec"
             print specargs
             print callargs

        for i,argname in enumerate(specargs[-len(defaults):]):
            try:
                if callargs[argname] == None:
                    callargs[argname] = defaults[i]
            except KeyError:
                # no local value for this argument - it will get the default anyway
                pass

        return thisfunc(**callargs)

    return wrappedfunc

#Decorate the funtion with the "None replacer".  Comment this out to see difference
@none2defaultdecorator            
def test(binarg = True, myint = 5):
    if binarg == True:
        print "Got binarg == true"
    elif binarg == False:
        print "Got binarg == false"
    else:
        print "Didn't understand this argument - binarg == ", binarg

    print "Argument values - binarg:",binarg,"; myint:",myint

test()
test(False)
test(True)
test(None)
test(None, None)

关于python - 当参数在 Python 中指定为 None 时,让函数使用参数的默认值的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28738025/

相关文章:

python - 高维向量的最佳聚类算法

javascript - 函数中的 Getters 和 Setters (javascript)

javascript - 如何改变js中的函数参数并且所有参数都是对象?

java - 能够从不同的类访问文本区域

c++ - 使用函数指针作为模板方法的默认参数时出错

python - 用 sympy 替换函数调用

Python:调用 process.terminate() 不会杀死它

python - IndexError : too many indices for array. 具有 42 个特征的 Numpy 数组不均匀

javascript - 获取函数的默认值?

c++ - 我可以绑定(bind)到采用默认参数的函数然后调用它吗?