3

我们的团队必须像下面这样摘录:

这个:

buf = StringIO.StringIO()
gzip.GzipFile(fileobj=buf, mode='wb').write(foo)
...

和这个:

buf = StringIO.StringIO()
tmp = gzip.GzipFile(fileobj=buf, mode='wb')
tmp.write(foo)
...

哪个更pythonic?

编辑:我有 try/catch 来做错误处理工作,但哪一个更 Pythonic?

4

3 回答 3

11

完成后需要关闭GzipFile对象,这样一行就行不通了。相反,使用上下文管理器表达式:

buf = StringIO.StringIO()
with gzip.GzipFile(fileobj=buf, mode='wb') as tmp:
    tmp.write(foo)

单行gzip.GzipFile(fileobj=buf, mode='wb').write(foo)非常危险的,因为它依赖于在GzipFile表达式末尾进行垃圾收集,以便刷新流。如果这未能发生(例如使用 Jython),那么buf将不包含预期的结果。

于 2012-07-30T11:26:08.473 回答
3

哪一个都好。选择你认为最易读的一个。

就个人而言,我会选择第一个,额外变量的使用不会为我添加任何东西。

也就是说,在这种情况下,ecatmur 是正确的,您需要GZipFile在将所有数据写入实例后关闭实例,因为这会将压缩数据刷新到buf并添加 gzip CRC 和大小信息。没有这个,您的数据可能不完整!

于 2012-07-30T11:22:43.483 回答
0

例如,

Man.eat.work.sleep()

方法链在 ruby​​/javascript 中很常见,我认为ruby/javascript style不是pythonic.

于 2012-07-30T12:12:44.570 回答