Python如何通过方括号定义可选参数的函数?

3

我经常看到一些函数的定义方式像这样:open(name[, mode[, buffering]]),我知道它表示可选参数。
Python文档说它是模块级别的函数。但当我尝试用这种风格定义一个函数时,总是失败。
例如:
def f([a[,b]]): print('123')
不起作用。
有人能告诉我模块级别意味着什么,以及如何用这种风格定义函数吗?


2
我认为你在谈论文档表示,就像Python2一样,也许Python3的文档更清晰?这是关于可选参数的,例如def f(a=None, b=None) - PRMoureu
4
方括号表示法不是代码,而是一种描述语言语法的方式,称为Backus-Naur形式。它广泛用于许多语言的文档中,不仅仅是Python。https://en.wikipedia.org/wiki/Augmented_Backus-Naur_form - cdarke
2
看起来这种风格没有真正的编码,因此文档表示只是表示,它并不代表真正的代码? - chenkh
准确地说!那么你的目标是编写一个接受可选参数的函数吗?你知道实现这个功能的一些方法吗? - PRMoureu
这个问题肯定是重复的吧?但我找不到一个合适的问题和匹配的答案。(是的,我看到了@jq发布的链接。但是当你定义一个带有可选参数的函数时,请不要使用*args参数!这不是20世纪80年代)。那个答案解决了另一个问题。 - alexis
显示剩余2条评论
2个回答

2
这是您在寻找的内容吗?
>>> def abc(a=None,b=None):
...  if a is not None: print a
...  if b is not None: print b
... 
>>> abc("a")
a
>>> abc("a","b")
a
b
>>> abc()
>>> 

!= has its dangers as well. Test for not None might be better as if not a is None: - cdarke
1
关于 is None== None:https://dev59.com/X2Yq5IYBdhLWcg3wui_F,https://dev59.com/6HE95IYBdhLWcg3wrPwn,https://www.python.org/dev/peps/pep-0290/#testing-for-none,https://www.python.org/dev/peps/pep-0008/#programming-recommendations - jeremye
1
@cdarke:“对于像None这样的单例对象,比较时应该始终使用is或is not,而不是等式运算符。”谢谢,我们在实践中学习。 - Rolf of Saxony
1
默认情况下,Python使用内存引用来检查Object实例的相等性(与原始类型不同)。但是,在Python中可以重写运算符,例如__eq__。这意味着ab不能保证只进行简单的引用检查。它可能尝试访问None实例内部的字段并出现错误。另一方面,is关键字仅进行引用测试-消除了潜在的错误。(由于操作更简单,因此也会更快地执行) - flakes
在Java世界中,类似的情况是==进行引用测试,而.equals将执行自定义比较。这使得==成为Java中首选的null检查选择,就像is是Python中首选的选择一样。 - flakes
显示剩余2条评论

1
  1. "如果我们可以使用这种方式定义可选参数(目前不行)"

    方括号表示法不是Python语法,它是Backus-Naur形式——仅用于文档标准。

  2. 模块级函数是在模块中定义的函数(包括__main__),这与在类内部定义的函数(方法)相对应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接