我剛纔讀下面一行的腳本:這個比較是什麼意思?
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
我真的不明白這是怎麼回事的。因此,將參數的數量與2和一個或一個語句進行比較。作者在做什麼,是一種很好的編碼風格?
我剛纔讀下面一行的腳本:這個比較是什麼意思?
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
我真的不明白這是怎麼回事的。因此,將參數的數量與2和一個或一個語句進行比較。作者在做什麼,是一種很好的編碼風格?
我個人覺得不好的編碼風格,因爲它不是那麼明顯發生了什麼(所以,你的問題)。
它是做什麼:
sys.argv
有2名以上的項目[sys.argv[2]]
['test_out.jpg']
A si mpler版本將是:
fn = sys.argv[2:] and sys.argv[2] or 'test_out.jpg'
更可讀的版本:在python行爲像在某些情況下短路
fn = sys.argv[2] if sys.argv[2:] else 'test_out.jpg'
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
是這樣的:
fn = ([sys.argv[2]] if len(sys.argv) > 2 else ['test_out.jpg'])[0]
在平原聲明:
if len(sys.argv) > 2:
fn = [sys.argv[2]][0]
else:
fn = ['test_out.jpg'][0]
正如你可以看到[...][0]
是有些多餘。所以原來的語句可replacecd如下:
fn = len(sys.argv) > 2 and sys.argv[2] or 'test_out.jpg'
更新,如果sys.argv[2]
爲空字符串上面的代碼將無法正常工作。這就是爲什麼原始代碼使用[...][0]
表單。因此,使用下面的表格,如果可能的:
fn = sys.argv[2] if len(sys.argv) > 2 else 'test_out.jpg'
and
和or
。
在表達式x and y
中,如果x評估爲False
,則不需要甚至查看y,因爲結果將是錯誤的。說,你想得到sys.argv[2]
,但只有在有足夠的參數的情況下。然後,你可以這樣做:
LEN(sys.argv中)> 2和[sys.argv中[2]
所以,如果sys.argv
的長度爲2或更低,那麼len(sys.argv) > 2
將評估爲假,也不會評估sys.argv[2]
(因此不碰到IndexError
)。
類似地,在表達式x or y
中,只有當x
評估爲False
時,纔會評估y
。因此,如果參數的數量小於或等於2,那麼fn
將採用值['test_out.jpg']
。
最後,使用表達式中的最後一個[0]
獲得第零個索引的括號。
總結:如果參數個數爲2或更多,則將fn
分配給sys.argv[2]
,否則將fn
分配給'test.out.jpg'
。
謝謝 - 不知道'sys.argv [2:]'在功能上等同於'len(sys.argv)> 2' ... –