首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python不接受关键字参数

python不接受关键字参数
EN

Stack Overflow用户
提问于 2012-09-08 18:47:25
回答 5查看 13.3K关注 0票数 8

我试图使我的代码不接受关键字参数,就像一些命令也不接受关键字参数一样,但是,我无法接受。根据我有限的理解,这是我的想法:-

代码语言:javascript
复制
def somefunc(a,b):
    print a,b

somefunc(10,20)

输出:

代码语言:javascript
复制
10 20

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

代码语言:javascript
复制
somefunc(b=10,a=20)

输出:

代码语言:javascript
复制
20 10

我有两个问题:-

  1. 查看函数调用somefunc(b=10,a=20)而不是函数定义,这可能是对只接受普通参数的函数的调用,或者是接受关键字参数的函数的调用。解释器如何区分两者?
  2. 是否可以将我们的任何函数转换成一种形式,使其不像许多内置函数那样接受关键字参数?

--为什么我想这么做?--我只是在检查我是否能做到这一点,这样我就不会错过深入理解python的任何东西。我确实知道巨蟒是否允许这样做。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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中指示某些函数参数必须按位置指定,不能用作关键字参数。

代码语言:javascript
复制
def somefunc(a, b, /):
    print(a, b)
票数 6
EN

Stack Overflow用户

发布于 2012-09-08 18:57:18

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

例如:

代码语言:javascript
复制
def somefunc(*args):
    print args[0], args[1]

不带关键字的呼叫:

代码语言:javascript
复制
somefunc(10,20)

给予:

代码语言:javascript
复制
10 20

用关键字调用:

代码语言:javascript
复制
somefunc(a=10,b=20)

给出错误:

代码语言:javascript
复制
TypeError: someFunc() got an unexpected keyword argument 'a'

不过,还不清楚你为什么要这么做。

票数 8
EN

Stack Overflow用户

发布于 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,那么它将不接受关键字参数,但是位置参数不能有单独的名称。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12333511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档