Python if / else不工作...如果条件不满足,但是不执行

时间:2013-01-01 04:58:47

标签: python amazon-s3 boto

好。我想到了。事实证明,当它不应该匹配时if不会完全运行,那是因为_s3_bucket.list(prefix=basename) = []。我对python的信心已经恢复。 :)谢谢大家!

为什么这段代码不能打印“不匹配”? 正则表达式匹配时,它会成功打印“匹配”,但如果没有,则不执行其他操作。 print type(match)会返回<type 'list'>

object_regex = re.compile('%s\.(\d+)\.%s' % \
    (re.escape('.'.join(basename.split('.')[:-2])),
     re.escape(basename.split('.')[-1])))
for obj in _s3_bucket.list(prefix=basename):
    match = object_regex.findall(obj.name)
    print match //prints nothing when nothing is found. not even []
    if match:
        print "matches"
    else:
        print "doesnt match"

我也试过

if not match:
    print "doesnt match"
else:
    print "matches"

它永远不会执行if。

打印输出(调用函数时上传到S3):

UPLOAD TO S3 /fonts/HelveticaNeueLTPro-Lt.1351206175.otf
[u'1351206175']
matches
UPLOAD TO S3 /fonts/HelveticaNeueLTPro-Bd.1351206175.otf
[u'1351206175']
matches
UPLOAD TO S3 /css/common.1357015625.css      <-- what is going on here?
UPLOAD TO S3 /css/landing-style.1356896077.css
[u'1356896077']
matches

当我print type(match)而不是print match时,我每次都会获得<type 'list'>,这让我相信匹配确实是一个空列表。但空列表应该这样做......

>>> match=[]
>>> if match:
...     print "ASDF"
... 
>>> if not match:
...     print "asdf"
... 
asdf

3 个答案:

答案 0 :(得分:2)

findall的返回值是一个列表。如果RE具有组,那么根据文档,它可以包括非匹配的空组条目。由于您使用的是组,因此可能会返回空元组列表。但由于列表不为空,因此计算结果为True。无论。

要显示此信息,请打印出findall的返回值。打印用于调试的东西是常见的做法。这将是我想做的第一个想法。

OR

你的方法_s3_bucket.list(prefix=basename)没有返回任何东西来迭代并跳过整个循环块。那是什么输出?

BUT

由于您动态构建RE并且我们不知道它的真实外观或匹配内容,因此我们无法确定。

答案 1 :(得分:0)

当没有匹配时,函数findall返回[]。 示例如下:

>>> import re
>>> res = re.findall('\d','ad34hsfg2')
>>> print res
['3', '4', '2']
>>> res = re.findall('\d','adhsfg')
>>> print res
[]
>>> print res == None
False
>>> print res == 0
False

所以,现在我觉得你应该明白。 我能回答你的问题吗?

答案 2 :(得分:0)

实际问题是_s3_bucket.list(prefix=basename) == [],object_regex.findall(obj.name)应该是[]。因此,if / else从未执行过。我不知道为什么然后,当我打印类型时,它仍然打印...但我想我忘了设置那个与正则表达式不匹配。

基本上,如果if / else似乎不起作用,它的控制流可能会被它之前的东西切断!

谢谢大家!和...新年快乐!