在 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 插件?
spacing
collapse
因此在上面的 4 个示例中,只有最后一个会通过检查,因为所有参数都已命名。
奇怪的是我们只会为某些功能打开它,但任何关于如何实现它的建议 - 或者如果它甚至可能的话,我们将不胜感激。
在 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:
**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'
所以你被迫总是给出价值。如果你不调用它,你就不必做任何其他名为参数的事情。