【问题标题】:How to elegantly ignore some return values of a Python function?如何优雅地忽略 Python 函数的一些返回值?
【发布时间】:2014-12-02 19:34:59
【问题描述】:

有时一个函数会给出一个返回值,你只想丢弃它而不是发送到输出流。处理这个问题的优雅方法是什么?

请注意,我们正在讨论一个返回您无法更改的内容的函数。

def fn():
    return 5

我个人之前用过null,但我正在寻找更pythonic的方式:

null = fn()

【问题讨论】:

  • “发送到输出流”是什么意思?
  • 仅在全局范围内评估 fn() 将“打印”值 5。
  • 这仅在交互式解释器中是正确的。如果您将文件作为脚本运行,则不会发生这种情况,并且它不会真正影响任何事情。我认为在交互式会话中抑制输出的需要并不足以保证您已经拥有的解决方案之外的任何东西。
  • 如果必须,请使用_ = fn()
  • @BrenBarn 啊,只有在交互式解释器中。好吧,在测试中,我现在打印了大量的废话。一般来说,最好知道一种避免它的方法。此外,即使在不打印它的函数中(存储在变量中,或不使用解释器)也可以用 Python 的方式来表明函数的结果并不重要。

标签: python return-value


【解决方案1】:

我真的很喜欢分配给 null 的想法 - 但它确实有一个意想不到的副作用:

>>> print divmod(5, 3)
(1, 2)
>>> x, null = divmod(5, 3)
>>> print null
2

对于那些主要使用 Python 编写代码的人来说,这可能不是问题:null 应该和 _ 一样是垃圾值。

但是,如果您在其他语言(如 Javascript)之间切换,则完全有可能意外地使用 null 而不是 None 来编写比较。 Python 不会吐出关于与未知变量进行比较的常见错误,而是会默默地接受它,现在你会得到你完全没想到的真假条件......这是你盯着的错误代码写了一个小时,一直搞不明白哪里错了,直到它突然袭击你,你觉得自己像个白痴。

明显的修复也不起作用:

>>> x, None = divmod(5, 3)
File "<stdin>", line 1
SyntaxError: cannot assign to None

...这真是令人失望。 Python(以及地球上的所有其他语言)允许所有参数被隐式丢弃,无论返回多少变量:

>>> divmod(5, 3)

...但是明确不允许通过将参数分配给 None 来丢弃参数?

感觉 Python 解释器将赋值为 None 描述为语法错误有点愚蠢,而不是故意选择一个明确的结果。谁能想到这样做的理由?

【讨论】:

    【解决方案2】:

    显示这一点的标准方法是将您不想要的结果分配给_。例如,如果一个函数返回两个值,但您只需要第一个值,请执行以下操作:

    value, _ = myfunction(param)
    

    大多数 Python linter 会识别 _ 的使用,不会抱怨未使用的变量。

    如果你想忽略所有返回,那么就不要分配任何东西;除非你告诉它,否则 Python 不会对结果做任何事情。打印结果只是 Python shell 中的一项功能。

    【讨论】:

    • 您并没有忽略它,而是将其分配给全局变量。引用 nosklo 的话:“当您将 gettext 功能添加到其他人的代码(定义了一个名为 '_' 的函数)时,这个“约定”很糟糕,因此应该禁止它”。如果有人使用他们最后的输出作为输入怎么办?
    • “你将它分配给一个全局变量”-> 不,你不是。 python repl 中的 '_' 是一个魔术变量,仅由 REPL 解释。它不存在于任何脚本执行中。 (在 REPL 中尝试del _,你会得到一个 NameError,因为它不是一个变量)。
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多