是否有任何标准方法可以避免Ruby中的真实性,或者我是否需要推出自己的解决方案,例如
class FalseClass
def to_bool
self
end
end
class TrueClass
def to_bool
self
end
end
true.to_bool # => true
false.to_bool # => false
nil.to_bool # => NoMethodError
42.to_bool # => NoMethodError
Run Code Online (Sandbox Code Playgroud)
背景:我知道这to_bool
会违背Ruby的宽容性质,但我正在玩三元逻辑,并且想要避免意外地做类似的事情
require "ternary_logic"
x = UNKNOWN
do_something if x
Run Code Online (Sandbox Code Playgroud)
我正在使用三元逻辑,因为我正在写一个flatmate共享网站的解析器(用于个人而非商业用途)并且某些字段可能缺少信息,因此不知道该地方是否存在是否符合我的标准.但是,我会尝试限制使用三元逻辑的代码量.
考虑:
a <- c("a", "b", "c")
b <- c("a", "e", "f")
c <- c("a", "h", "i")
> a %in% b %in% c
[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
我希望这可以评估TRUE FALSE FALSE
,因为每个向量中的第一个元素是"a".为什么不是这样?
我也在这一点上画空白.而不是提供答案,我将不胜感激,如果有人可以帮助我理解为什么我的代码不打印预期的输出:
def bool_to_str(bval):
if bval is True:
mytest = 'Yes'
else:
mytest = 'No'
return mytest
Run Code Online (Sandbox Code Playgroud)
预期产量:
>>>bool_to_str([1, 2, 3])
'Yes'
>>>bool_to_str(abcdef)
'Yes'
Run Code Online (Sandbox Code Playgroud)
实际输出的是什么:
>>>bool_to_str([1, 2, 3])
'No'
>>>bool_to_str(abcdef)
'No'
Run Code Online (Sandbox Code Playgroud)
请帮我理解我做错了什么.我认为函数需要测试参数的实际真值,但我不明白我错过了什么.
我见过以下情况:
>>> def func(a):
... if a:
... print("True")
...
>>> a = [1, 2, 3]
>>> func(a)
True
>>> a == True
False
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种差异?
我在 Python 文档的真值测试下发现了一个令人惊讶的句子:
\n\n\n除非另有说明,具有布尔结果的运算和内置函数始终返回 0 或 False(表示 false)和 1 或 True(表示 true)。
\n
关系运算符似乎没有例外语句,因此 IIUC 它们可以返回0
and1
而不是某些内置类型(例如 )的值上的False
and ,甚至是不确定的。True
7 < 3
因此,为了满足我的代码生成类型值bool
或防御性编程(只要这很重要)的规范要求,我应该将逻辑表达式包装在对 的调用中吗bool
?
附加问题:为什么会有这个纬度?它是否使 CPython 或其他实现变得更容易?
\n编辑\n问题已得到解答并且我已接受,但我想在PEP 285 \xe2\x80\x93 添加布尔类型中添加它,我发现了以下语句:
\n我在Python 3.4中有这样的函数:
def is_value_valid(the_str):
return len(the_str) != 0
Run Code Online (Sandbox Code Playgroud)
当然还有其他方法来写这个,比如return the_str != ""
.是否有更多pythonic方式来编写这个表达式?我熟悉truthy/falsy的概念,所以我知道我可以在if条件下快捷方式:
if not the_str:
# do stuff
Run Code Online (Sandbox Code Playgroud)
但是if
期望在它的表达式中有一个布尔结果(这是我作为C++程序员的天真过度简化;我不熟悉这方面的标准).但是,没有任何东西可以强制表达式在return语句中求值为boolean.我试过只返回字符串,只要没有人将返回的值视为字符串,它在boolean context下调用代码就可以了.但是从后置条件的角度来看,我不想返回非布尔类型.
我正在实现一个看似微不足道的实用程序函数来检查值是否为null
或undefined
。
我原来的实现是这样的:
function isNil(value) {
return value === null || value === undefined;
}
Run Code Online (Sandbox Code Playgroud)
然后我查找了Lodash 的实现:
function isNil(value) {
return value == null
}
Run Code Online (Sandbox Code Playgroud)
从表面上看,这似乎是一种天真的方法,因为它违反了 eslint 的eqeqeq 规则并且只检查null
.
我猜测这种方法之所以有效是因为 JavaScript 的真实性和相等性规则的结合,但是 Lodash 的实现实际上有优势吗?
在Python中你可以做到
print (0 or None or False or "" or [] or "hello" or None or "bar")
Run Code Online (Sandbox Code Playgroud)
这将打印
hello
Run Code Online (Sandbox Code Playgroud)
你能用清单做同样的事吗?即是否有Python功能,foo
以便以下也将打印hello
?
print (foo([0, None, False, "", [], "hello", None, "bar"]))
Run Code Online (Sandbox Code Playgroud)
请注意,bar
不打印.
我最近遇到了一些检查日期时间对象的代码,并认为可以稍微清理一下:
# original
if (datetime1 and (datetime2 is None)):
do_things()
# slightly cleaner version
if (datetime1 and not datetime2):
do_things()
Run Code Online (Sandbox Code Playgroud)
但我意识到,如果存在一个计算结果为 False 的有效日期时间对象,这两个语句并不完全相同。例如:
if not '':
print('beep')
else:
print('boop')
# output: beep
if '' is None:
print('beep')
else:
print('boop')
# output: boop
Run Code Online (Sandbox Code Playgroud)
在Python中查找有关日期时间/时间/日期对象的布尔值的信息时,我一无所获。有谁知道Python是如何处理这个问题的?如果我遇到不同对象类型的类似问题,是否有可靠的方法来检查其布尔值何时为 true 或 false?
我有以下Python代码:
if bedrooms: # bedrooms exists
.....
else: # BEDROOMS DOES NOT EXIST
bn = "BEDROOMS DOES NOT EXIST"
Run Code Online (Sandbox Code Playgroud)
我在我的调试器中单步执行它,并注意到即使bedroom == 0
流程跳转到else
语句.
为了测试这个我试过:
>>> bedrooms
0.0
>>> type(bedrooms)
<type 'float'>
Run Code Online (Sandbox Code Playgroud)
有人能解释一下这里发生了什么吗?
truthiness ×10
python ×7
boolean ×2
if-statement ×2
evaluation ×1
javascript ×1
list ×1
lodash ×1
logic ×1
null ×1
or-operator ×1
python-3.x ×1
r ×1
ruby ×1
types ×1
undefined ×1