Closed. This question needs
debugging details。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为
on-topic用于堆栈溢出。
3年前关闭。
Improve this question
我刚刚遇到了最奇怪的错误。我还没有机会对其进行完全调试,但是我想发布它,看看是否有人遇到过类似的问题。
问题
下面的代码在下载文件的功能中。如果存在最终文件,则
if
语句逻辑旨在跳过下载步骤。
log.debug('force: {}, isfile: {}'.format(force, os.path.isfile(fasta_path)))
log.debug('if result: {}'.format(force or not os.path.isfile(fasta_path)))
if force or not os.path.isfile(fasta_path):
# we don't have the file, so download it
log.info('Downloading reference FASTA')
else:
log.info('FASTA found--skipping download.')
运行时,将打印出以下内容:
[17-02-14 05:03:32 - __main__:119 - DEBUG] force: False, isfile: True
[17-02-14 05:03:32 - __main__:120 - DEBUG] if result: False
[17-02-14 05:03:32 - __main__:124 - INFO] Downloading reference FASTA
分解
force
变量旨在允许用户“强制”进行下载,而不管现有数据如何。从输出中可以看到,它是
False
。
如输出所示,文件路径有效且文件存在。
因此,if语句本质上是
False or not True
,应该(并且也应该在输出中)将其评估为
False
;但是,条件条件的
True
(
Downloading reference
)被执行。
我已经尝试过括号和一些最小的调试,但是我找不到发生这种情况的任何原因。例如,以下代码可以在python解释器中正常工作:
if False or not True:
print('hi')
else:
print('bye')
环境
在Docker容器中的ubuntu 16.04上使用Python 3.5时会发生此问题。
正如@ user2357112在评论中指出的那样,force
很有可能是一个字符串:
>>> print('if result: {}'.format("False" or not True))
if result: False
>>> "False" or not True
'False'
>>> type("False" or not True)
<class 'str'>
>>> bool("False" or not True)
True
这可能就是第二条调试语句显示False(因为它显示字符串而不是 bool(boolean) 值)的原因。您可以通过以下任一方法进行测试
log.debug('if result: {}'.format(bool(force or not os.path.isfile(fasta_path))))
(预期输出
if result: True
)或
log.debug('if result: {}'.format(repr(force or not os.path.isfile(fasta_path))))
(预期输出
if result: 'False'
-注意引号表示它是字符串而不是 bool(boolean) 值)
编辑说明:根据
4.2. Boolean Operation,根据
x or y
评估表达式
if x is false, then y, else x
。因为根据
4.1. Truth Value Testinge,只有空序列是
False
(在真值测试的情况下),所以序列
'False'
是
True
。因此,
'False' or x
的计算结果为字符串
'False'
(与
x
的值无关)。在打印期间,
'False'
不会解释为 bool(boolean) 值。但是,在if语句中,将测试字符串
'False'
中的
Truth
...