【问题标题】:python how to define function with optional parameters by square brackets?python如何通过方括号定义带有可选参数的函数?
【发布时间】:2018-02-18 01:21:47
【问题描述】:

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

【问题讨论】:

  • 我认为您是在谈论文档表示,就像python2 一样,也许python3 文档更清楚?这是关于可选参数的,比如def f(a=None, b=None)
  • 方括号符号不是代码,它是一种描述语言语法的方式,称为巴科斯-瑙尔形式。它被广泛用于许多语言的文档,而不仅仅是 python。 en.wikipedia.org/wiki/Augmented_Backus-Naur_form
  • 这种风格好像没有真正的编码,所以doc表示只是表示,并不代表真正的代码?
  • 没错!现在你的目标是什么,编写一个接受可选参数的函数?你知道实现这一目标的一些方法吗?

标签: python


【解决方案1】:

这是你要找的吗?

>>> 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()
>>> 

【讨论】:

  • 在这种情况下将None 等同于False 并不是一个好主意。如果ab 的值为0(零)或""(空字符串)怎么办?
  • != 也有它的危险。测试不是None 可能比if not a is None: 更好
  • @cdarke "比较像 None 这样的单例应该总是用 is 或 not 来完成,永远不要用相等运算符。"谢谢你,我们生活和学习。
  • 默认情况下,python 使用内存引用来检查 Object 实例的相等性(不同于原语)。但是,python 中的运算符可以被覆盖,例如__eq__。这意味着ab 不能保证是简单的参考检查。它可能会尝试访问None 实例中的字段,然后出错。另一方面,is 关键字只会进行参考测试——消除潜在的错误。 (由于操作更简单,它也会执行得更快)
【解决方案2】:

"1.是否可以用这种方式定义可选参数(目前没有)"

方括号符号不是 python 语法,它是 Backus-Naur 形式 - 它只是一个文档标准。

  1. 模块级函数是在模块中定义的函数(包括__main__) - 这与在类(方法)中定义的函数形成对比。

【讨论】:

    【解决方案3】:

    到目前为止,我仍然没有得到预期的答案。一开始看到open(name[, mode[, buffering]])这样的表达方式,我真的很想知道这是什么意思。这显然意味着可选参数。在那一刻,我发现它可能是一种不同的方式(不同于像f(a,b,c=None,d='balabala') 这样的普通方式)来定义一个带有可选参数的函数,但不仅告诉我们它是可选参数。这篇写的好处可以帮助我们使用可选参数但没有默认值,所以我认为这是一种更清晰,更简单的方式来定义可选参数。
    我真正想知道的是两件事:1.我们是否可以使用这种方式定义可选参数(目前没有)2.如果有人可以解释模块级函数的含义会很好吗? 我非常感谢上述答案和 cmets!非常感谢

    【讨论】:

    • "1.如果我们可以使用这种方式定义可选参数(目前没有)" - 使用哪种方式?您的意思是使用方括号表示法吗?正如我试图解释的那样,这不是 python 语法,它是 Backus-Naur 形式——它只是一个文档标准。 2. 模块级函数是在模块中定义的函数(包括__main__)——这与在类(方法)中定义的函数形成对比。
    • 谢谢。你可以写这个作为答案,我会接受的。
    猜你喜欢
    • 2016-10-08
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多