17

我想知道是否可以确定是否在 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中完成的事情吗?

谢谢

4

5 回答 5

15

约定是经常使用arg=None和使用

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

检查它是否通过。允许用户通过None,这将被解释为参数通过。

于 2008-11-01T06:17:54.533 回答
11

当您说“命名参数”时,我猜您的意思是“关键字参数”。dict.pop()不接受关键字参数,所以这部分问题没有实际意义。

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

也就是说,检测是否提供了参数的方法是使用*argsor**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 调用约定,其中参数可以按位置或名称提供,并且多次提供的参数(按位置和名称)会导致错误。

于 2008-11-01T02:45:13.463 回答
4

你可以这样做:

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

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

有关完整信息,请参阅有关调用的 Python 文档。

于 2008-11-01T02:34:46.123 回答
2

我不确定我是否完全理解你想要什么;然而:

def fun(arg=Ellipsis):
    if arg is Ellipsis:
        print "No arg provided"
    else:
        print "arg provided:", repr(arg)

那是你想要的吗?如果不是,那么正如其他人所建议的那样,您应该使用*args, **kwargs语法声明您的函数,并在 kwargs 字典中检查参数是否存在。

于 2008-11-01T03:19:07.063 回答
1
def f(one, two=2):
   print "I wonder if", two, "has been passed or not..."

f(1, 2)

如果这是您问题的确切含义,我认为无法区分默认值中的 2 和已通过的 2 。即使在检查模块中,我也没有找到如何实现这种区分。

于 2008-11-01T02:58:41.423 回答