python不接受关键字参数

God*_*Man 6 python keyword-argument

我试图让我的代码不接受关键字参数,就像一些bulitins也是不接受的关键字参数,但是,我不能这样做.在这里,根据我的有限理解,我的想法是: -

def somefunc(a,b):
    print a,b

somefunc(10,20)
Run Code Online (Sandbox Code Playgroud)

输出:

10 20
Run Code Online (Sandbox Code Playgroud)

现在,当我运行以下内容时(我知道这不是函数定义中的关键字参数,但是,查看函数调用,它似乎与调用接受关键字参数的函数时的语法相同) :

somefunc(b=10,a=20)
Run Code Online (Sandbox Code Playgroud)

输出:

20 10
Run Code Online (Sandbox Code Playgroud)

我有两个问题: -

  1. 查看函数调用somefunc(b=10,a=20)而不是函数定义,这似乎是对只接受普通参数的函数的调用或接受关键字参数的函数.口译员如何区分两者?
  2. 是否有可能在表单中转换我们的任何函数,以便它不像许多内置函数那样接受关键字参数?

为什么我要这样做呢? 我只是在检查我是否可以这样做,所以我不会错过任何深入理解python的东西.我知道python是否允许这样做.

mka*_*ala 8

您可以使用任意参数列表来执行此操作.请参阅http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists

例如:

def somefunc(*args):
    print args[0], args[1]
Run Code Online (Sandbox Code Playgroud)

没有关键字的电话:

somefunc(10,20)
Run Code Online (Sandbox Code Playgroud)

得到:

10 20
Run Code Online (Sandbox Code Playgroud)

使用关键字调用:

somefunc(a=10,b=20)
Run Code Online (Sandbox Code Playgroud)

给出错误:

TypeError: someFunc() got an unexpected keyword argument 'a'
Run Code Online (Sandbox Code Playgroud)

目前还不清楚你为什么要这样做.

  • +1 - _目前还不清楚你为什么要这样做._ - 只是因为你_can_做到了_ases not not_表示可以做到这一点. (2认同)

hyn*_*cer 5

广告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)
Run Code Online (Sandbox Code Playgroud)