2013-10-02 53 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'