我试图使我的代码不接受关键字参数,就像一些命令也不接受关键字参数一样,但是,我无法接受。根据我有限的理解,这是我的想法:-
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的任何东西。我确实知道巨蟒是否允许这样做。
发布于 2012-09-09 07:07:58
( ad 1)正确的名称如果被调用为somefunct(name=value, ...),将由Python自动验证。我不需要记住参数的确切的标准顺序,也不需要通过每个月在每次使用时查看文档来验证它的“神经质”,如果我记得一个参数描述性很好的函数,并且它将被测试它们是否被Python接受。相反,使用的参数的正确顺序只能通过文档来验证。通过命名参数调用比非常长的位置参数列表更好。因此,所报告的行为是有充分根据的。(短的单个字母参数"a,b“当然无助于避免错误。)
( 2)一些著名的内置快速函数在C语言中编写,所需参数数量不多,不支持使用命名参数进行调用。(例如hasattr)
这是因为它们只使用简单的标头...(... PyObject *args),因此所有命名的参数都会自动被拒绝。(Python永远不能内省C源代码中的参数名称。:-)
许多其他C函数都有一个头...(... PyObject *args, PyObject *kwds),它们通过实现更为复杂的验证PyArg_ParseTupleAndKeywords和将名称写入文档字符串来明确地支持确切的名称列表。
编辑:通过新的函数参数语法/,位置唯一参数可以在Python3.8中指示某些函数参数必须按位置指定,不能用作关键字参数。
def somefunc(a, b, /):
print(a, b)发布于 2012-09-08 18:57:18
您可以使用任意参数列表来执行此操作。请参阅http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists
例如:
def somefunc(*args):
print args[0], args[1]不带关键字的呼叫:
somefunc(10,20)给予:
10 20用关键字调用:
somefunc(a=10,b=20)给出错误:
TypeError: someFunc() got an unexpected keyword argument 'a'不过,还不清楚你为什么要这么做。
发布于 2012-09-08 18:54:15
看看函数调用(b=10,a=20),而不是函数定义,这可能是对只接受普通参数的函数的调用,或者是接受关键字参数的函数的调用。解释器如何区分两者?
不知道这是不是你想要的,但如果我理解你的话,答案是“它不是”。无论如何在函数中定义参数,都可以使用关键字调用函数。如果使用关键字语法传递任何参数(例如,f(a=...)),则Python将相应的值绑定到函数定义中具有相同名称的参数。是否定义了默认值并不重要。这两种函数定义不会创建不同的“类型”参数,只是其中一些参数可能具有默认值,而其他参数则可能没有。因此,无论您是做def f(a)还是def f(a=2),您仍然可以做f(a=...)。唯一的限制是必须首先传递/定义位置参数(例如,不能执行def f(a=2, b)或f(a=2, 3))。另见这个答案。
至于问题的第二部分,我不知道如何阻止Python函数接受命名参数的关键字传递值。如果只定义*args,那么它将不接受关键字参数,但是位置参数不能有单独的名称。
https://stackoverflow.com/questions/12333511
复制相似问题