我正在寫一個數據分析程序,涉及很多步驟和大量數據集。有時候我想在路上保存鹹菜,有時候不會。我將稱這些節省「檢查站」。格式化如果嘗試除了其他代碼塊
如果pickle文件是可讀的,並且全局變量PICKLE
是True
,我可以跳過一些分析步驟。擺出代碼的愚蠢,但冗長的方法是這樣的:
if PICKLE:
try:
with open('pickle1.pkl', 'rb') as f:
data1 = pickle.load(f)
except:
# do things to generate data1
temp = step1()
data1 = step2(temp)
with open('pickle1.pkl', 'wb') as f:
pickle.dump(data1, f)
else:
# do things to generate data1
temp = step1()
data1 = step2(temp)
這是許多在我的分析只是一個「關卡」,並獲得這些「關卡」,一般需要的不僅僅是兩個步驟多。因此,將上面的代碼進行佈局會產生大量重複的代碼。
我可以把事情功能略有改善的事情,但要強調的醜陋,我將展示2個關卡:
def generateData1():
# do things
return data1
def generateData2():
# do things
return data2
if PICKLE:
try:
with open('pickle1.pkl', 'rb') as f:
data1 = pickle.load(f)
except:
data1 = generateData1()
with open('pickle1.pkl', 'wb') as f:
pickle.dump(data1, f)
else:
data1 = generateData1()
if PICKLE:
try:
with open('pickle2.pkl', 'rb') as f:
data2 = pickle.load(f)
except:
data2 = generateData2()
with open('pickle2.pkl', 'wb') as f:
pickle.dump(data2, f)
else:
data2 = generateData2()
現在更少的代碼重複每一個「關卡」,但一些事情,這是非常醜陋的,並且通過頂部的所有功能,以及底部的所有流控制和檢查點結構代碼,閱讀代碼需要大量的跳躍和跳躍。此外,這些示例中的所有代碼都會針對我要創建的每個檢查點重複執行,並且它們都具有完全相同的結構。
我不禁想起有一個優雅的解決方案,用最少量的重複代碼,仍然大部分是可讀的。
一個小小的改進:如果你不改變兩個if語句之間的'PICKLE'的值,那麼你可以合併這兩個塊並只檢查一次'PICKLE'。 – 2rs2ts