我试图在右边的默认参数值的下面的函数中使用左侧参数的值。
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中的默认参数值中使用参数值?您如何建议我解决这个问题?
答案 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'
此处,args
是var
之后提供的参数列表,可以是空列表。然后,如果列表不为空(这相当于第二个参数),则返回此列表的第一个元素。如果列表为空,我们返回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
常量。