为什么python中的调用函数包含等于value的变量?

Pet*_*sek 14 python

我已经开始学习python了,我想问一下我认为这种语言有点神奇的东西.

我想要注意,在学习python之前,我使用PHP并且在那里我没有注意到.

发生了什么 - 我注意到Python中的一些调用构造函数或方法就是这种形式.

object.call(variable1 = value1, variable2 = value2)
Run Code Online (Sandbox Code Playgroud)

例如,在FLask中:

app.run(debug=True, threaded=True)
Run Code Online (Sandbox Code Playgroud)

这个惯例有什么理由吗?或者是否有一些从语言基础传出的语义原因?我没有在PHP中看到像Python这样的东西,因为我真的很惊讶.我真的很好奇是否有一些魔法,或者只是简单地阅读代码的惯例.

aba*_*ert 23

这些被称为关键字参数,它们通常用于使调用更具可读性.

它们也可以用于以与声明的参数不同的顺序传递参数,或者跳过一些默认参数但是将参数传递给其他参数,或者因为函数需要关键字参数......但可读性是它们存在的核心原因.

考虑一下:

app.run(True, False)
Run Code Online (Sandbox Code Playgroud)

你知道这两个论点是什么意思吗?即使你可以猜测只有两个合理的参数是线程和调试标志,你怎么能猜出哪一个先来?你能做到的唯一方法是找出什么类型app,并检查app.run方法的文档字符串或定义.

但在这里:

app.run(debug=True, threaded=False)
Run Code Online (Sandbox Code Playgroud)

这显然意味着什么.


值得一读的常见问题参数和参数有什么区别?,以及上面链接的其他教程部分.然后,你可以阅读参考函数的定义以获取参数的全部细节,并呼吁全细节上的争论,终于inspect在各种参数模块文档.

这篇博客文章试图总结这些参考文献中的所有内容,因此您无需阅读整个过程中的所有内容.最后的示例还应该用于说明为什么混合参数和参数,关键字参数和默认参数,参数解包和变量参数等会导致您误入歧途.


Rob*_*obᵩ 5

通过关键字指定参数通常比仅通过位置指定参数产生的错误风险更小。考虑这个函数来计算贷款付款:

def pmt(principal, interest, term):
    return **something**;
Run Code Online (Sandbox Code Playgroud)

当一个人试图计算购买房屋的摊销时,可能会这样调用:

payment = pmt(100000, 4.2, 360)
Run Code Online (Sandbox Code Playgroud)

但很难看出哪些值应与哪个参数相关联。如果不检查文档,我们可能会认为它应该是:

payment = pmt(360, 4.2, 100000)
Run Code Online (Sandbox Code Playgroud)

使用关键字参数,调用变得自记录:

payment = pmt(principal=100000, interest=4.2, term=360)
Run Code Online (Sandbox Code Playgroud)

此外,关键字参数允许您更改调用站点的参数顺序,并且一切仍然正常工作:

# Equivalent to previous example
payment = pmt(term=360, interest=4.2, principal=100000)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments 。

  • @SteveBarnes - 正是如此。我写这个回复是因为其他人关注默认值......OP从未询问过。 (3认同)