我最近在Python中使用了tkinter,而在tkinter中创建对象的实例时传递参数的方式一直让我感到困惑。
当我创建一个类自己,每一个可以传递参数,具有传递。但是,在tkinter中创建任何窗口小部件的实例时,不必立即传递所有可能的参数。它们各自默认为特定值。考虑以下用于创建画布小部件的代码:
canvas = tkinter.Canvas(root, width = 400, height = 250)
值(400,25)甚至不需要按顺序传递,它们由值之前的名称(宽度,高度)标识。我可以指定其他值(例如,background,border),但是没有必要这样做,因为默认值很好。
我已经搜索了很长时间,试图找到答案,但是,由于我不确定要如何称呼这些特殊参数,因此很难找到有关此内容的任何文字。
有个叫默认参数的东西,
def default_parameters(var1 = "cabbage"):
print var1
default_parameters(var1 = "salad") # salad
default_parameters("salad") # salad
default_parameters() # cabbage
default_parameters("salad", "cabbage") # Error! Expects only one parameter
在此,如果未传递任何参数,则使用定义中指定的默认值。
如果要接受许多参数,可以像这样在参数部分中解压缩它们
def many_parameters(var1, var2 = "cabbage", *args):
print var1, var2, args
many_parameters("salad", "cabbage", "rabbit", "ninja", "puppy")
# salad cabbage ('rabbit', 'ninja', 'puppy')
many_parameters("salad", "cabbage", "rabbit", "ninja")
# salad cabbage ('rabbit', 'ninja')
many_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',)
many_parameters("salad", "cabbage")
# salad cabbage
many_parameters("salad")
# salad cabbage
many_parameters()
# many_parameters() takes at least 1 argument (0 given)
many_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
many_parameters("salad", "puppy", var2 = "ninja")
# many_parameters() got multiple values for keyword argument 'var2'
在第一种情况下,将salad
和cabbage
分配给var1
和var2
,但是将其余的值分配给args
作为元组。
第二和第三种情况与第一种相同。
第四种情况没有额外的参数,因此args
将为空。
第五种情况没有额外的参数,也没有的值var2
,因此args
将为空,并cabbage
假设使用默认值()var2
。
在第六种情况下,var1
没有提供任何默认值。因此,它失败并显示at-least 1 argument expected
错误。
在第七种情况下,var2
(命名变量)在未命名参数之前使用。这在Python中是错误的。
在第八种情况下,var2
(命名变量)和puppy
(位置参数)都被设置为var2
。现在,Python无法决定要使用哪个值var2
。因此,它失败了。
在前面的案例中,我们看到了如何处理默认参数和命名参数。现在,命名参数也称为关键字参数,通常表示为**kwargs
,实际上是所有命名参数的键-值对的字典。注意:默认参数不算作关键字参数。
def all_parameters(var1, var2 = "cabbage", *args, **kwargs):
print var1, var2, args, kwargs
all_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',) {}
all_parameters("salad", "cabbage")
# salad cabbage () {}
all_parameters("salad")
# salad cabbage () {}
all_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
all_parameters("salad", "puppy", var2 = "ninja")
# all_parameters() got multiple values for keyword argument 'var2'
all_parameters("salad", moderator="jonclements", python="martijinpieters")
# salad cabbage () {'moderator': 'jonclements', 'python': 'martijinpieters'}
我相信,除了最后一项之外,其他两个示例中已经涵盖了其他所有内容。在最后一种情况下,所有非默认但已命名的参数都存储在kwargs
字典中。
注意:请记住函数定义中的*
in*args
和**
in **kwargs
。它们负责传递给函数的参数的打包。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句