如何定义带有可选参数的函数?

新手上路,请多包涵

我有一个 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]

原文由 Thalia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

原文由 Russell Borogove 发布,翻译遵循 CC BY-SA 3.0 许可协议

只需使用 *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 之后作为键值的所有参数

原文由 Nix 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题