How to evaluate string as boolean in return statement?
我在python 3.4中有一个类似的函数:
1 2
| def is_value_valid(the_str):
return len(the_str) != 0 |
当然,还有其他的方法来写这个,比如return the_str !=""。有更多的Python式的表达方式吗?我熟悉Truthy/Falsy的概念,因此我知道我可以在if条件下将其简化为:
1 2
| if not the_str:
# do stuff |
但是EDCOX1〔1〕期望它的表达式中有一个布尔结果(这是我在这里作为C++程序员的简单化,我不熟悉标准化程序)。但是,没有什么可以强制表达式在RETURN语句中计算为布尔值。我尝试过只返回字符串,只要没有人将返回的值视为字符串,它在布尔上下文下调用代码时就可以正常工作。但从post-condition的角度来看,我不想返回非布尔类型。
- bool(the_str)??????????????
- if the_str:将是的最大Python的方式来写它。这不是要到部队的interpreter铸造的型。if并不希望一个布尔结果在Python。在Python中,if不过treats全为结果的布尔值,无论他们是布尔或不。
- 总的来说,'foo' or 'bar'并不返回一个布尔either。。。。。。。你可能不得不放松你定义一个truthy Python的价值准则。
- 为什么不简单的if not bool(the_str)???????
- "为什么不if not the_strBurhan简???????
- 恕我直言,"大Python的路将是最简单的使用ifstatement。你为什么要浪费一个函数呼叫中心的一些琐碎的SO???????除非,当然,是的,这是一种简化的实例。
- 我不明白真正的推理背后的explicitly铸造中的值,请appreciate clarification。。。。。。。(我收集的那页有一些attempt explain到它的问题,但我没有得到它。)
- "pm2ring:因为你不能返回ifstatement。if the_str: return True,else: return False远更是矫枉过正。和有可能会多一些,在函数的?如果是字符串是氢的外部呼叫吗?
- "martijnpieters:understood。。。。。。。如果真的是更复杂的代码比什么,在OP,当时担心,它可能使意识到这套在一个函数。但是如果真正的代码是简单的测试,如果一个字符串是空的或不,那时我认为它的更好的有一个简单的显式ifRather比调用的函数。
- "pm2ring:我有试过要回归的字符串,和AS AS好长一treats的returned值作为一个字符串,它是美术厂在调用代码在布尔上下文。但是,从一个角度后的空调,我不想返回一个非布尔型…………………SO的意向是用函数返回一个布尔值。回归的一个字符串,而不是一exposes实施细节的函数和时返回的错误的类型。bool()是只读的适当的溶液用这个使用案例。
- "martijnpieters:悲伤。如果真的需要一个函数的运算方法,这bool(),当时是正确的解决方案。我需要的是提问的方法is_value_valid函数中的第一位。我猜一个"将是对呼叫bool()inline,而比它具有隐藏在is_value_valid。。。。。。。
这正是bool()函数所做的;返回基于评估参数真值的布尔值,就像if语句将:
注意,if不需要布尔值。它只评估表达式结果的真值。
- return True if the_str else False。我一直在PHP中看到这个奇怪的三元习语的等价物。我不明白我们为什么要做这个练习。:(
- @Kojiro:如果一个函数承诺返回一个布尔值,那么最好实际返回一个布尔值。这使得界面更清晰。
- 这就是原因吗?从这个问题来看,这听起来似乎是因为if期望一个布尔值,而不是一个函数承诺的值。
- @Kojiro:这是后条件透视图;后条件是对函数功能的期望。这里的post条件是返回一个布尔值。
- 好啊。我可以接受这一解释,但我确实在努力的过程中有一段时间挠头了!
- @Kojiroreturn $foo ? true : false在任何语言中都很糟糕。在PHP中,应该是return (bool)$foo,如果有的话。
- "欺骗"是的。我同意。然而
- @Kojiro:有大量反模式在广泛使用,等待成为bug。像这个或者这个,看看为什么python 3.x的super()有魔力?有很多程序员不懂他们的手艺。
if语句自动将字符串计算为布尔值。但是,如果您想将字符串作为布尔值返回,只需
- 你参加这个聚会很晚了。为什么要重复别人15分钟前说过的话?
正如一些人所提到的,bool(the_str)无疑是前进的道路。
但是,如果您的方法要求给定一个字符串,我还将测试实际上是字符串的字符串(因为bool(5)和bool("this is a string")都将返回true。
1
| return isinstance(the_str, str) and bool(the_str) |
或者在if语句中使用时:
1 2
| 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的值,因此不总是布尔值。
1 2 3 4
| >>> bool("foo")
True
>>> bool("")
False |
空字符串对False进行计算,但其他所有值都对True进行计算。因此,这不应该用于任何类型的解析目的。
所以在你的情况下,只需使用return bool(the_str)。
1 2
| def is_value_valid(the_str):
return bool(len(the_str) != 0) |
使用bool(x)将值转换为布尔值。此函数获取len(the_str) != 0,对其进行计算,将其转换为bool,然后返回值。
bool(x)不是必需的,您可以只使用括号,因为它已经返回bool,因为计算默认返回bool。
- !=已经返回了bool,用bool()重新包装是完全多余的。