在 python 中,如何验证可选到可选的关键字参数?
这个问题是对this question的扩展我关于这个可选参数到可选参数的事情,(顺便说一句,它有更好的名字吗?)
我们知道我们可以用这种风格定义可选参数:
os.fdopen(fd[, mode[, bufsize]])
因此,如果我错误地通过 fdopen(sth, bufsize=16)
调用了 fdopen
,python 会指出我必须指定 mode
来使用 bufsize
参数。
这是如何实现的?我显然可以写很多 if-elseses 来完成这项工作,但这会导致那些非常复杂的函数出现一些非常困惑的代码,例如:
cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
最佳答案
在 Python 级别没有特定的语法。您必须定义普通的可选参数并自己进行验证。
您正在查看的具体案例是用 C 语言实现的。根据您所处的平台,C 语言的实现方式有所不同。 Here's the version for POSIX, Windows, and OS/2:
static PyObject *
posix_fdopen(PyObject *self, PyObject *args)
{
...
if (!PyArg_ParseTuple(args, "i|si", &fd, &orgmode, &bufsize))
return NULL;
PyArg_ParseTuple
的使用意味着该函数实际上不接受任何名称参数。如果你执行 os.fdopen(sth, bufsize=16)
,你会得到一个类型错误:
>>> os.fdopen('', bufsize=16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: fdopen() takes no keyword arguments
请注意,bufsize
参数没有真正的理由应该依赖于 mode
参数。我认为这个函数可能早于关键字参数,尽管很难确定。关键字参数已添加到 Python all the way back in 1.3 , python.org 上最早的 Python 文档是针对 1.4 的,到那时os.fdopen
was definitely around .
关于可选参数验证的python可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378600/