我刚才读下面一行的脚本:这个比较是什么意思?
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' ... –