一尘不染

Python中参数的强制命名

python

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

def info(object, spacing=10, collapse=1)

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

info(odbchelper)                    
info(odbchelper, 12)                
info(odbchelper, collapse=0)        
info(spacing=15, object=odbchelper)

感谢 Python 允许任意顺序的参数,只要它们被命名。

我们遇到的问题是,随着我们的一些较大函数的增长,人们可能会在spacingand之间添加参数collapse,这意味着错误的值可能会传递给未命名的参数。此外,有时并不总是清楚需要输入什么。我们正在寻求一种强制人们命名某些参数的方法——不仅仅是编码标准,理想情况下是标志或 pydev 插件?

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

奇怪的是我们只会为某些功能打开它,但任何关于如何实现它的建议 - 或者如果它甚至可能的话,我们将不胜感激。


阅读 165

收藏
2022-03-29

共1个答案

一尘不染

在 Python 3 中 - 是的,您可以*在参数列表中指定。

来自文档

”或“identifier”之后的参数是关键字参数,只能传递使用过的关键字参数。

>>> def foo(pos, *, forcenamed):
...   print(pos, forcenamed)
... 
>>> foo(pos=10, forcenamed=20)
10 20
>>> foo(10, forcenamed=20)
10 20
>>> foo(10, 20)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 1 positional argument (2 given)

这也可以与**kwargs

def foo(pos, *, forcenamed, **kwargs):

完成示例:

def foo(pos, *, forcenamed ):
    print(pos, forcenamed)

foo(pos=10, forcenamed=20)
foo(10, forcenamed=20)
# basically you always have to give the value!
foo(10)

输出:

Traceback (most recent call last):
  File "/Users/brando/anaconda3/envs/metalearning/lib/python3.9/site-packages/IPython/core/interactiveshell.py", line 3444, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-12-ab74191b3e9e>", line 7, in <module>
    foo(10)
TypeError: foo() missing 1 required keyword-only argument: 'forcenamed'

所以你被迫总是给出价值。如果你不调用它,你就不必做任何其他名为参数的事情。

2022-03-29