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)
我有两个问题: -
somefunc(b=10,a=20)而不是函数定义,这似乎是对只接受普通参数的函数的调用或接受关键字参数的函数.口译员如何区分两者?为什么我要这样做呢? 我只是在检查我是否可以这样做,所以我不会错过任何深入理解python的东西.我知道python是否允许这样做.
您可以使用任意参数列表来执行此操作.请参阅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)如果正确的名称称为,则会由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)
| 归档时间: |
|
| 查看次数: |
8552 次 |
| 最近记录: |