如何使用可选参数创建Python函数?

时间:2012-03-02 20:30:08

标签: python function arguments optional-arguments

我有一个Python函数,它有几个参数。在某些情况下,可以省略其中一些参数。

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

参数dh是各自具有不同含义的字符串。重要的是我可以选择以任意组合传递哪些可选参数。例如,(a, b, C, d, e),或(a, b, C, g, h),或(a, b, C, d, e, f,或所有这些(这些是我的选择)。

如果我可以重载函数会很棒 - 但我读到Python不支持重载。我试图在列表中插入一些必需的int参数 - 并得到一个参数不匹配错误。

现在我发送空字符串代替前几个缺少的参数作为占位符。我希望能够使用实际值来调用函数。

有没有办法做到这一点?我可以传递一个列表而不是参数列表吗?

现在使用ctypes的原型看起来像:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]

3 个答案:

答案 0 :(得分:149)

只需使用* args参数,它允许您在a,b,c之后传递任意数量的参数。你必须添加一些逻辑来映射args-> c,d,e,f但它是一种重载的“方式”。

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

它会打印c,d,e,f


同样,您可以使用kwargs参数,然后您可以为参数命名。

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

然后kwargs将会有一个字典,其中包含a,b之后的所有参数值。{/ 1}

答案 1 :(得分:118)

尝试将其称为:obj.some_function( '1', 2, '3', g="foo", h="bar" )。在所需的位置参数之后,您可以按名称指定特定的可选参数。

答案 2 :(得分:8)

这样做很容易

def foo(a = None):
       print(a)

如果没有参数,您可以输入任何应该到位的内容,而不是 None,例如,如果您不会像这样写参数的值 foo() 那么它将打印 None 因为没有给出参数,如果你会给它一个像 foo("hello world") 这样的参数,然后它会打印 hello world