2013-01-01 51 views
1

那麼。我想到了。事實證明,如果它不應該完全運行,它不應該匹配,這是因爲_s3_bucket.list(prefix=basename) = []。我對Python的信心已經恢復。 :) 謝謝你們!Python if/else不工作...不滿足條件,但其他不執行

爲什麼此代碼片段無法打印「不匹配」? 當正則表達式匹配時,它成功地打印「匹配」,但當它不成功時,它不執行else。 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" 

,它永遠不會執行如果任。

打印輸出(上傳至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 
+1

請打印一份obj的手裏的素材。這將幫助我們幫助你... – rh0dium

+0

同意@Thomas和Ignacio。你告訴我們它不執行其他的一面。你確定它「不匹配」嗎? – rh0dium

+1

其含義是它永遠不會執行if _block_(而不是_else_塊)而不是整個語句。如果我正確地閱讀這個問題,'if match'總是評估爲真。 –

回答

0

實際的問題是_s3_bucket.list(prefix=basename) == [],當object_regex.findall(obj.name)應該是[]。因此,if/else從未執行過。我不知道爲什麼然後,當我打印類型,它仍然打印...但我想我忘了設置一個不匹配正則表達式。

基本上,如果一個if/else似乎不起作用,那麼它的控制流可能會被前面的某些東西切斷!

謝謝大家!新年快樂!

2

返回值findall是一個列表。如果RE具有組,則根據文檔,它可以包括用於不匹配的空組條目。由於您正在使用組,它可能會返回空元組列表。但由於列表不是空的,它的計算結果爲True。而不管。

要顯示此信息,請輸出findall的返回值。印刷材料的調試是常見的做法。那將是我想要做的第一個想法。

OR

你的方法_s3_bucket.list(prefix=basename)不返回任何東西來遍歷和整個循環塊被跳過。那是什麼輸出?

我們真的不能告訴你,因爲動態構造的RE,我們不知道什麼是真正的樣子或者是什麼,它將匹配。

+0

已被添加到原始問題。我做的第一件事是打印類型和價值,這讓我更加困惑這個bug!哈哈 –

0

當沒有匹配時,函數findall return []。 的例子如下:

>>> 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 

所以,現在我想你應該明白。 我能回答你的問題嗎?

+0

但是,當我嘗試 x = [] 如果不是x: 打印「ASDF」 它將打印。 –

相關問題