2013-10-02 49 views
2

我剛纔讀下面一行的腳本:這個比較是什麼意思?

fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0] 

我真的不明白這是怎麼回事的。因此,將參數的數量與2和一個或一個語句進行比較。作者在做什麼,是一種很好的編碼風格?

回答

3

我個人覺得不好的編碼風格,因爲它不是那麼明顯發生了什麼(所以,你的問題)。

它是做什麼:

  1. 看看sys.argv有2名以上的項目
  2. 如果有超過2項,返回[sys.argv[2]]
  3. 否則,返回['test_out.jpg']
  4. 從前面返回項目(總是列表),返回項目0.

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' 
+0

謝謝 - 不知道'sys.argv [2:]'在功能上等同於'len(sys.argv)> 2' ... –

5
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' 
+0

可能是PEP308推出之前的2.5倍時代前的殘餘。 – fjarri

+0

感謝您的快速回復。我不是英語母語的人,所以我無法在文檔中找到這個短代碼。它怎麼叫? – JasonTS

+0

@JasonTS它類似於[條件表達式](http://docs.python.org/2/reference/expressions.html#conditional-expressions) – TerryA

0

andor

在表達式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'