python - Python中参数的强制命名

标签 python function coding-style parameter-passing

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

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

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

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

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

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

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

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

最佳答案

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

来自 docs :

Parameters after “*” or “*identifier” are keyword-only parameters and may only be passed used keyword arguments.

>>> 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'

所以你不得不总是给出值(value)。如果你不调用它,你就不必做任何其他名为参数强制的事情。

关于python - Python中参数的强制命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2965271/

相关文章:

客户端-服务器模型的 Python 套接字支持/线程

python - 413 请求实体太大 - 常规修复不起作用

r - 嵌套函数是否更慢?

function - 在 Lisp 中,如何通过作为参数传递的名称从宏中调用函数?

c++ - 使用数据库模型(键)来引用运行时对象,好主意还是坏主意?

ios - AppCode:关闭自动匹配大括号

python - 列表理解产生错误的值

python - Flower 中的高级任务格式化(Celery 监控)

c - 如何从函数返回 2 个数字

c# - 在 C# 中组合多个属性