“Keyword-Only 参数”是 3.0 版中添加的 Python 功能, 功能是只要启用了“Keyword-Only ”参数的声明:只能由关键字提供且永远不会由位置参数自动填充的参数, 它在 PEP 3102 中有描述,可读性很强,但我认为该功能可以从更多示例和基本原理中获益。
要理解Keyword-Only关键字参数,我们首先必须消除对 Python 位置参数和关键字参数的常见误解, 考虑以下功能:
defprint_greeting(name, use_colors=False):# ...
我们通常将其视为具有一个位置参数和一个关键字参数,并期望调用代码将像这样使用它:
print_greeting("Mary")print_greeting("Mary", use_colors=True)print_greeting("Mary", use_colors=False) # 冗余但明确
事实上,你也可以像下面这样调用这个函数(尽管看到这些形式通常会感到惊讶):
print_greeting("Mary", True)print_greeting(name="Mary")print_greeting(use_colors=True, name="Mary")
换句话说,两个参数都可以按位置或按名称传递, 从技术上讲,你应该将位置参数或关键字参数视为由函数调用而不是函数定义。
name 和 use_colors 之间的正确区别是 use_colors 有一个默认参数值,而 name 没有。
弄清楚这一点后,我们现在可以在脑海中区分两个不同的问题:
当人们调用我们的函数时,我们应该鼓励或期望或强制他们使用关键字参数,还是位置参数?
我们对每个参数都有一个好的默认值吗?
使用 Python 的Keyword-only关键字参数,我们可以独立地处理这两个问题。
为了使 use_colors 无法按位置传递,我们可以这样定义它:
defprint_greeting(name, *, use_colors=False):# ...
这带来了一些优点:
它使调用代码更明确(但也更冗长), 将不再可能看到如下代码:
print_greeting("Mary", True)......乍一看看会想知道“那个布尔参数是什么意思?”
它允许我们作为函数作者添加更多关键字参数,以我们想要的任何顺序定义,而不会破坏使用我们函数,因为他们是按位置而不是按名称传递参数。
一旦我们有了这些Keyword-only限关键字的参数,我们还可以问“我们真的有好的默认值吗?” 假设我们意识到颜色代码的使用非常重要,并且每次使用 print_greeting 函数时都必须传递——我们没有一个好的默认值, 我们可以这样写我们的函数:
defprint_greeting(name, *, use_colors):pass
然后调用:
print_greeting("Mary", use_colors=True)如果调用者未能传递 use_colors,他们会看到此错误消息:
TypeError: print_greeting() missing1requiredkeyword-onlyargument: 'use_colors'目前还没有看到那么多Keyword-only关键字参数的使用,但这个特性非常重要,大家可以更多的使用这个特性使自己的代码更加健壮。
原文:https://lukeplant.me.uk/blog/posts/keyword-only-arguments-in-python/
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等 推荐阅读
Python+PostgreSQL数据库交互详解:从基础连接到高级ORM
点击 阅读原文 了解更多