Python中参数的强制命名

在Python中,您可能有一个函数定义:

定义信息(对象,间距=10,折叠=1)

可通过以下任一方式调用:

信息(odbchelper)
信息(odbchelper,12)
信息(odbchelper,折叠=0)
信息(间距=15,对象=odbchelper)

多亏Python允许任何顺序参数,只要它们被命名

我们遇到的问题是,随着一些更大的函数的增长,人们可能会在间距折叠之间添加参数,这意味着错误的值可能会指向未命名的参数。此外,有时并不总是清楚需要加入什么。我们在寻找一种方法来强迫人们命名某些参数——不仅仅是一个编码标准,更理想的是一个标志或pydev插件

因此,在上述4个示例中,只有最后一个将通过检查,因为所有参数都已命名

很可能我们只会在某些功能上启用它,但是对于如何实现它的任何建议,或者如果可能的话,我们都将不胜感激

在Python3-Yes中,可以在参数列表中指定*

从文档:

“*”或“*标识符”后的参数仅为关键字参数和
只能使用关键字参数传递

&gt&燃气轮机&燃气轮机;def foo(位置*,部队名称):
...   打印(位置、名称)
... 
&燃气轮机&燃气轮机&燃气轮机;foo(位置=10,力=20)
10 20
&燃气轮机&燃气轮机&燃气轮机;foo(10,forcename=20)
10 20
&燃气轮机&燃气轮机&燃气轮机;傅(10,20)
回溯(最近一次呼叫最后一次):
文件&quot&书信电报;stdin&gt&引用;,第1行,in<模块>
TypeError:foo()正好接受1个位置参数(给定2个)

这也可以与**kwargs结合使用:

def foo(位置*,部队名称,**kwargs):

要完成示例,请执行以下操作:

def foo(位置*,强制命名):
打印(位置、名称)
foo(位置=10,力=20)
foo(10,forcename=20)
#基本上,你总是要给出价值!
傅(10)

输出:

回溯(最近一次呼叫最后一次):
文件&quot/Users/brando/anaconda3/envs/metalearning/lib/python3.9/site packages/IPython/core/interactiveshell.py“;,第3444行,运行代码中
exec(代码对象、self.user\u全局、self.user\n)
文件&quot&书信电报;ipython-input-12-ab74191b3e9e&gt&引用;,第7行,in<模块>
傅(10)
TypeError:foo()缺少1个只需关键字的参数:“forceName”

因此,您必须始终给出值。如果你不叫它,你就不需要做任何其他的事情

发表评论