Python:函数参数有多个可能的值

6

我继承了一些看起来像这样的 Python 代码:

name = 'London'
code = '0.1'
notes = 'Capital of England'
ev = model.City(key=key, code=code, name=name or code, notes=notes)

为了学习,我想知道 name or code 参数的含义。这是说“如果name不为空,则使用name,否则使用code”吗?

那么,在Python文档中,提供多个可能参数的技术术语是什么呢?

谢谢!


我的错,已经修改,抱歉。得停止使用伪代码! - AP257
6个回答

15

几乎没错。它说如果名称不为假,则使用名称评估为假的事物包括但不限于:

  • False
  • 空序列(()、[]、"")
  • 空映射({})
  • 0
  • None

编辑:在回答中添加了SilentGhost提供的链接。


1
请参阅文档中提供的完整列表:http://docs.python.org/library/stdtypes.html#truth-value-testing - SilentGhost
@AP257 关于在Python文档中查找信息,建议阅读以下章节:http://docs.python.org/reference/expressions.html#boolean-operations - mikej

7
在Python中,or运算符返回第一个操作数,除非它的值为假,此时返回第二个操作数。实际上,如果未指定name,则使用name,否则使用默认值code

3
"or" 运算符返回其操作数的实际值,而不仅仅是 "True" 或 "False",这一澄清对于一般教育和作为对原始问题的回答都非常重要。 - Boris Gorelik

2

没错,这个习语会返回第一个被评估为True的值(通常不是None)。使用时要小心,因为有效值(如零)可能会被无意中放弃。更安全的方法是:

if name is not None:
  # use name

或者

name if name is not None else code

1

启动 Python 控制台:

>>> name = None
>>> code = 0.1
>>> name or code
0.10000000000000001

如果名称为false,则表达式将计算为code。否则将使用名称。

1
为了学习的目的,我想知道名称或代码参数的作用。这是在说“如果名称不为空,则使用名称,否则使用代码”吗?
基本上是这样的,但是在Python中,Null可能意味着更多的事情(空字符串,无等)。
就像在您的情况下:
>>> name = 'London'
>>> code = 0.1
>>> name or code
'London'
>>> name = ''
>>> code = 0.1
>>> name or code
0.1000....

但很奇怪的是,一个函数参数有时可以是整数,有时又可以是字符串。

希望这可以帮到你 :=)


1
为避免混淆,我要说这不是默认参数值的示例,而只是布尔表达式的求值。默认参数值是在方法定义中提供默认值的情况,例如:def some_method(param1, some_flag = False): # some_flag defaults to False if omitted at call time。另外,正如其他人所说,空字符串、空列表等的值为假(falseness),而不是空值(null)。 - mikej
@mikej:我从他的问题中理解到,像(this)这样的多个可能参数是指默认参数值,也许我误解了:) 因为这取决于该函数或或者? - mouad
我认为@AP257(楼主)认为name or code是一种特殊的参数传递语法,实际上它是表达式的求值,并且可以在任何表达式可以使用的地方使用。 - mikej
@mikej:嗯,也许你是对的,谢谢指正 :) 我会重新编辑。 - mouad

0

你大致上说得对,但是 'null' 并不是决定因素。基本上任何会被评估为 false(0、false、空字符串 '')的东西都会导致第二个字符串显示而不是第一个。在这种意义上,'x or y' 有点相当于:

if x: x
else: y

一些控制台操作:

x = ''
y = 'roar'
x or y
-'roar'
x = 'arf'
x or y
-'arf'
x = False
x or y
-'roar'


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