【问题标题】:How to evaluate string as boolean in return statement?如何在返回语句中将字符串评估为布尔值?
【发布时间】:2016-04-17 05:35:39
【问题描述】:

我在 Python 3.4 中有这样的函数:

def is_value_valid(the_str):
    return len(the_str) != 0

当然还有其他写法,比如return the_str != ""。有没有更多的 Pythonic 方式来编写这个表达式?我熟悉真/假的概念,所以我知道我可以在 if 条件下简化它:

if not the_str:
    # do stuff

但if 期望在其表达式中出现布尔结果(这是我作为 C++ 程序员的天真过分简化;对此我不熟悉标准语言)。但是,没有任何东西可以强制表达式在 return 语句中计算为布尔值。我试过只返回字符串,只要没有人将返回的值视为字符串,它在布尔上下文下调用代码就可以正常工作。但从后置条件的角度来看,我不想返回非布尔类型。

【问题讨论】:

  • bool(the_str)??
  • @Burhan 为什么不简单地if not the_str?
  • 恕我直言,最 Pythonic 的方式是简单地使用 if 语句。为什么要为如此琐碎的事情浪费函数调用?当然,除非这只是一个简化的例子。
  • 我真的不理解显式转换值背后的原因,希望得到澄清。 (我收集到有人试图在问题中解释它,但我不明白。)
  • @PM2Ring: 我试过只返回字符串,只要没有人将返回值视为字符串,它在布尔上下文下调用代码就可以了。但从后置条件的角度来看,我不想返回非布尔类型。。所以目的是让函数返回一个布尔值。相反,返回字符串会公开函数的实现细节并返回错误的类型。 bool() 是此用例的唯一合适的解决方案。

标签: python boolean truthiness


【解决方案1】:

bool(the_str) 绝对是正确的选择,正如一些人提到的那样。

但如果你的方法要求给出一个字符串,我也会测试这个字符串是否真的是一个字符串(因为bool(5) 和bool("this is a string") 都会返回true。

return isinstance(the_str, str) and bool(the_str)

或者在if 语句中使用时:

if isinstance(the_str, str) and the_str:
    # here we are sure it's a string whose length > 0

【讨论】:

  • 在if 上下文中,只需使用isinstance(the_str, str) and the_str;使用bool() 完全是多余的。
  • 这不是问题所要问的。他们在询问如何生成一个布尔值以从函数返回。这与验证测试的值是否为字符串无关,而只是如何为真值生成布尔值。
  • 我认为这取决于上下文——对于某些方法return isinstance(the_str, str) and bool(the_str) 可能是必要的
  • 这将再次返回 False 或 the_str 的值,因此并不总是布尔值。
【解决方案2】:

if 语句自动将字符串评估为布尔值。但是,如果您想将字符串作为布尔值返回,您只需这样做

return bool(the_str)

【讨论】:

  • 你来晚了。为什么要重复其他人 15 分钟前已经说过的话?
【解决方案3】:

这正是bool() function 所做的;根据评估参数的truth value 返回一个布尔值,就像if 语句一样:

return bool(the_str)

请注意,if 不期望布尔值。它只是评估表达式结果的真值。

【讨论】:

  • return True if the_str else False。我一直在 PHP 中看到这种奇怪的三元成语的等价物。我只是不明白我们为什么要做这个练习。 :(
  • @kojiro:如果一个函数承诺返回一个布尔值,最好实际返回一个布尔值。这使得界面更简洁。
  • 这是为什么?从这个问题来看,听起来这个论点是 if expects 一个布尔值,而不是一个函数承诺它。
  • @kojiro:这就是后置条件;后置条件是对函数作用的期望。这里的后置条件是返回一个布尔值。
  • @kojiro:有大量反模式被广泛使用,等待成为错误。喜欢this one 或this one,请参阅Why is Python 3.x's super() magic?。有很多程序员不懂他们的手艺。
【解决方案4】:
def is_value_valid(the_str):
    return bool(len(the_str) != 0)

使用 bool(x) 将值转换为布尔值。此函数接受len(the_str) != 0,对其求值,将其转换为布尔值,然后返回值。

bool(x) 不是必需的,您可以只使用括号,因为它已经返回一个布尔值,因为默认情况下评估返回布尔值。

【讨论】:

  • != 已经返回了一个bool,在bool() 中再次包装它完全是多余的。
【解决方案5】:
>>> bool("foo")
True
>>> bool("")
False

空字符串评估为False,但其他所有字符串评估为True。所以这不应该用于任何类型的解析目的。

所以在你的情况下只是return bool(the_str)。

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2011-01-18
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多