我已经开始学习python了,我想问一下我认为这种语言有点神奇的东西。
我想要注意的是,在学习python之前,我使用过PHP,并且没有注意到它。
发生了什么 - 我注意到Python中的一些调用构造函数或方法就是这种形式。
object.call(variable1 = value1, variable2 = value2)
例如,在FLask中:
app.run(debug=True, threaded=True)
这个惯例有什么理由吗?或者是否有一些从语言基础传出的语义原因?我没有在PHP中看到像Python这样的东西,因为我真的很惊讶。我真的很好奇是否有一些魔法,或者只是简单地阅读代码的惯例。
答案 0 :(得分:22)
这些被称为keyword arguments,它们通常用于使调用更具可读性。
它们也可以用于以与声明的参数不同的顺序传递参数,或者跳过一些默认参数但是将参数传递给其他参数,或者因为函数需要关键字参数......但是可读性是它们的核心原因存在。
考虑一下:
app.run(True, False)
你知道这两个论点是什么意思吗?即使你可以猜测只有两个合理的参数是线程和调试标志,你怎么能猜出哪一个先来?您可以做到的唯一方法是确定app
的类型,并检查app.run
方法的文档字符串或定义。
但是在这里:
app.run(debug=True, threaded=False)
这显然意味着什么。
值得阅读常见问题解答What is the difference between arguments and parameters?,以及上面链接的其他教程部分。然后,您可以在Function definitions上阅读有关参数的完整详细信息,并阅读Calls以获取有关参数的完整详细信息,最后阅读有关各种参数的inspect
模块文档。
This blog post尝试总结这些参考文献中的所有内容,这样您就不必在整个过程中阅读。最后的例子还应该用来说明为什么通常混合参数和参数,关键字参数和默认参数,参数解包和变量参数等会让你误入歧途。
答案 1 :(得分:3)
通过关键字指定参数通常比仅通过位置指定参数产生更少的错误风险。考虑此功能来计算贷款支付:
def pmt(principal, interest, term):
return **something**;
当人们试图计算他们购买房屋的摊还时,可能会调用它:
payment = pmt(100000, 4.2, 360)
但很难看出哪些值应与哪个参数相关联。如果不查看文档,我们可能会认为它应该是:
payment = pmt(360, 4.2, 100000)
使用关键字参数,调用将变为自我记录:
payment = pmt(principal=100000, interest=4.2, term=360)
此外,关键字参数允许您更改呼叫站点参数的顺序,一切仍然正常:
# Equivalent to previous example
payment = pmt(term=360, interest=4.2, principal=100000)
有关详细信息,请参阅http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments。
答案 2 :(得分:0)
它们是由关键字传递的参数。 keyword arguments和位置参数之间没有语义差异。
它们通常像“选项”一样使用,并为这种情况提供更易读的语法。想一想:
>>> sorted([2,-1,3], key=lambda x: x**2, reverse=True)
[3, 2, -1]
对战(python2):
>>> sorted([2,-1,3], None, lambda x: x**2, True)
[3, 2, -1]
在第二个例子中你能说出None
或True
的含义是什么吗?
请注意,在python3中引入了关键字 only 参数,即只能 使用此语法指定的参数。在python2中,任何参数都可以按位置指定(使用**kwargs
时除外,但这是另一个问题)。
答案 3 :(得分:-1)
没有“魔力”。
一个功能可以:
始终是此订单。
试试这个:
def foo(*args, **kwargs):
print args
print kwargs
foo(1,2,3,4,a=8,b=12)
输出:
(1, 2, 3, 4)
{'a': 8, 'b': 12}
Python将位置参数存储在一个元组中,该元组必须是不可变的,而字符串中的密钥元组则存储。
答案 4 :(得分:-2)
该约定的主要用途是,当它们之间可能存在某些默认值时,它允许设置某些输入。当一个函数有很多参数时,它们特别有用,其中大多数参数的默认值都很好,但是有些函数需要设置为其他值才能使函数按需运行。
示例:
def foo(i1, i2=1, i3=3, i4=5):
# does something
foo(1,2,3,4)
foo(1,2,i4=3)
foo(1,i2=3)
foo(0,i3=1,i2=3,i4=5)