python不接受关键字参数
问题内容:
我试图使我的代码不接受关键字参数,就像某些bulitins也不接受关键字参数一样,但是,我无法这样做。根据我有限的理解,这是我的想法:
def somefunc(a,b):
print a,b
somefunc(10,20)
输出:
10 20
现在,当我运行以下命令时(我知道这不是函数定义中的关键字参数,但是, 看一下函数调用,它似乎与调用接受关键字参数的函数时的语法相同 ) :
somefunc(b=10,a=20)
输出:
20 10
我有两个问题 :
- 查看函数调用
somefunc(b=10,a=20)
而不是函数定义,这似乎是对仅接受常规参数的函数的调用,或者是对接受关键字参数的函数的调用。口译员如何区分两者? - 是否可以将我们的任何函数转换为某种形式,以使其不像许多内置函数那样接受关键字参数?
为什么我要这样做? 我只是在检查是否可以执行此操作,以便在深入了解python时不会错过任何内容。我不知道python是否允许。
问题答案:
广告1)如果正确的名称称为,则会由Python自动验证它们somefunct(name=value, ...)
。如果我记得一个函数具有很好的参数描述性名称,并且我将测试它是否被接受,我就不必记住参数的确切标准顺序,也不必每个月在每种用法下查看文档来验证它是否“神经质”通过Python。相反,只能通过文档来验证所用参数的正确顺序。与很长的位置参数列表相比,首选使用命名参数进行调用。因此,所报告的行为是有充分根据的。(短单字母参数“
a,b”当然不能帮助避免错误。)
ad 2)一些用C编写的,数量很少的必需参数的内置快速函数不支持使用命名参数进行调用。(例如hasattr
)
这是因为它们仅使用简单的标头...(... PyObject *args)
,因此所有已命名的参数都会被自动拒绝。(Python绝对不能内省C源代码中的参数名称。
许多其他C函数都有一个标头,...(... PyObject *args, PyObject *kwds)
并且它们通过实现更复杂的验证PyArg_ParseTupleAndKeywords
并将名称写入docs字符串来显式地支持名称的准确列表。
编辑: 仅位置参数 在 Python 3.8中 是可能的,它通过新的函数参数语法 /
来指示某些函数参数必须在位置上指定,并且不能用作关键字参数。
def somefunc(a, b, /):
print(a, b)