可选参数验证的python可选参数

标签 python

在 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/

相关文章:

python - 使用 Python boto 列出 AWS EC2 实例安全组的入站

python - 使用 Autobahn Wamp Cra 时如何使用延迟返回身份验证密码?

Python 查找出现次数超过 3 次的重复项

python - 在旧版本的 Python 上使用通过 ParamSpec 键入的 Python 代码

python - 正则表达式捕获多行文本正文

python - 并排放置两个 wx 网格

Python 与 Ruby On Rails : on Size

python - 针对 Pandas 数据框运行逻辑表达式

python - 属性错误 : 'list' object has no attribute 'values' Centos7 Python

python - 使用 Numpy 在元组列表之间进行外部减法