是否可以在Python中的默认参数值赋值中使用参数的值?

时间:2016-08-18 03:00:03

标签: python

我试图在右边的默认参数值的下面的函数中使用左侧参数的值。

        List<KeyValuePair<string, string>> arrUsers = new List<KeyValuePair<string, string>>(){
            new KeyValuePair<string, string>("1", "Test"),
            new KeyValuePair<string, string>("2", "Test2")
        };
        fUserSelect.DataSource = arrUsers;
        fUserSelect.DataValueField = "Key";
        fUserSelect.DataTextField = "Value";           
        fUserSelect.SelectedIndex = 0;
        fUserSelect.DataBind();

但是我收到NameError:名称'var'未定义。是否不可能在Python中的默认参数值中使用参数值?您如何建议我解决这个问题?

5 个答案:

答案 0 :(得分:3)

不可能;怎么样?

def function(var, vartwo = None):
    if vartwo is None:
        vartwo = var*2
    return vartwo

print(function(7))
print(function(7,6))

hack是将默认值设置为None,然后在内部进行设置。如果不是none,则返回用户输入的内容。

答案 1 :(得分:2)

推卸责任:

def function(var, *args):
    return (lambda var, vartwo=var * 2: vartwo)(var, *args)


print(function(7))  # should print 14
print(function(7, 6))  # should print 6
  

我知道lambda函数但是想补充说明吗?

由于我们无法在var的定义中使用vartwo,我们会通过lambda设置新的参数列表来延迟,其中var现在已定义且vartwo的默认值是合法的。

我通过重复使用var变量名来表示两个不同的变量(function的形式参数和lambda的形式参数),这也让我感到有些困惑。位置占位符。

我可以而且可能应该更简单地将其写成:

def function(var, *args):
    return (lambda vartwo=var * 2: vartwo)(*args)

但我想保留原始问题的味道。

答案 2 :(得分:0)

由于尚未声明var,因此无法正常工作。这是一种不同的方法:

def function(var, multiply=False):
    if multiply:
        return var * 2
    else:
        return var

print(function(7, True))  # 14
print(function(6))  # 6

答案 3 :(得分:0)

不可以,不能使用未在函数外定义的值作为该函数的参数值。

另一方面,我迟到了,但如果None是第二个参数,那么短而简单的事情会怎样?

def function(var, *args):
    return args[0] if args else var * 2


print(function(7))  # prints 14
print(function(7, 6))  # prints 6
print(function(7, None))  # prints 'None'

此处,argsvar之后提供的参数列表,可以是空列表。然后,如果列表不为空(这相当于第二个参数),则返回此列表的第一个元素。如果列表为空,我们返回var * 2

这里需要注意的是,如果提供了两个以上的参数,则不会抛出相应的错误。您可以选择TypeError len(args) > 1手动提高args(在第一个之后记住var sportIds = { 0: 'soccer', 1: 'baseball', 2: 'tennis', ... 36: 'sportsbusiness' }; 是参数),如果这对于强制执行非常重要。

答案 4 :(得分:0)

无法在默认值中使用另一个参数的值。原因很简单:默认值只计算一次:在执行函数定义时。

一个常用模式是默认情况下将第二个参数设置为特殊的sentinel值,然后测试该参数是否在函数内再次设置:

SENTINEL = object()

def function(var, vartwo=SENTINEL):
    # was vartwo set?
    if vartwo is not SENTINEL:
        return vartwo

    return var * 2

这样,即使您传递vartwo或任何其他值,该函数也会正确返回None,除非您特别传递了SENTINEL常量。