2012-07-30 15 views
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) 
... 

哪一個更Python?

編輯: 我有try/catch做錯誤處理工作,但哪一個更pythonic?

+2

稀疏比密集的年輕蚱蜢好。 – 2012-07-30 11:22:34

+1

我寧願使用'with'語句來描述未使用的版本,但我懶得用我的移動設備來寫答案。 – 2012-07-30 11:30:58

回答

3

兩者都很好。選擇你認爲最具可讀性的一個。

就我個人而言,我會去第一個,使用額外的變量不會爲我添加任何東西

這就是說,在這種情況下ecatmur是正確的,你需要的所有數據寫入到它後關閉GZipFile情況下,作爲壓縮數據刷新到buf,並增加了gzip的CRC和大小信息。沒有這個,你的數據可能不完整!

+2

尤其考慮到它的名字非常有意義。 – Voo 2012-07-30 11:25:28

+0

同意ecatmur評論如下。但Martijn Pieters是唯一的人回答了這個問題:「使用額外的變量不會爲我增加任何東西。」 – dennisyuan 2012-07-31 03:04:21

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將不包含預期的結果。

+3

更重要的是,關閉'GZipFile'實例對於完成壓縮以及編寫基本的CRC值是至關重要的! – 2012-07-30 11:30:17

0

例如,

Man.eat.work.sleep() 

方法鏈接是紅寶石/ JavaScript的常見的,我覺得它更ruby/javascript stylepythonic

+0

不,你可以在Python中看到它,在適當的地方。例如,以SQLAlchemy爲例,查看鏈接是非常常見的,因爲在使用SQL數據時應用連續的過濾器是有意義的。 – 2012-07-30 12:24:33

相關問題