确定是否传递了命名参数

20 投票
5 回答
33136 浏览
提问于 2025-04-11 09:32

我想知道在Python中,是否可以判断一个带默认值的函数参数是否被传入了。例如,dict.pop是怎么工作的?

>>> {}.pop('test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> {}.pop('test',None)
>>> {}.pop('test',3)
3
>>> {}.pop('test',NotImplemented)
NotImplemented

pop方法是怎么知道第一次调用时没有传入默认返回值的?这是只有C语言才能做到的事情吗?

谢谢

5 个回答

4

你可以这样做:

def isdefarg(*args):
    if len(args) > 0:
        print len(args), "arguments"
    else:
        print "no arguments"

isdefarg()
isdefarg(None)
isdefarg(5, 7)

想要了解更多信息,可以查看Python的文档,关于调用的部分。

17

通常的做法是使用 arg=None,然后用

def foo(arg=None):
    if arg is None:
        arg = "default value"
        # other stuff
    # ...

来检查这个参数是否被传入。这样用户可以传入 None,这就意味着这个参数好像是没有被传入一样。

13

我想你说的“命名参数”其实是指“关键字参数”。dict.pop() 这个方法不接受关键字参数,所以这部分问题就不重要了。

>>> {}.pop('test', d=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments

不过,要检测一个参数是否被提供,可以使用 *args**kwargs 这种写法。例如:

def foo(first, *rest):
    if len(rest) > 1:
        raise TypeError("foo() expected at most 2 arguments, got %d"
                        % (len(rest) + 1))
    print 'first =', first
    if rest:
        print 'second =', rest[0]

通过一些工作,结合使用 **kwargs 的写法,可以完全模拟 Python 的调用规则。在这种规则下,参数可以通过位置或名称提供,如果同一个参数被多次提供(无论是通过位置还是名称),就会出现错误。

撰写回答