bka*_*uka 2 python layout readability
我正在编写一个包含许多步骤和大量数据的数据分析程序.有时我想在途中保存泡菜,有时候不是.我将把这些保存称为"检查站".
如果咸菜文件是可读的,和一个全局变量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)
Run Code Online (Sandbox Code Playgroud)
这只是我分析中许多人的"检查点",而进入这些"检查点"通常需要的不仅仅是两个步骤.因此,如上所述布置我的代码会产生大量重复的代码.
我可以通过将功能放入功能中来略微改进,但为了强调丑陋,我将展示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()
Run Code Online (Sandbox Code Playgroud)
现在每个"检查点"都会重复更少的代码,但是这一点非常难看,并且通过将所有函数放在顶部,并且所有流控制和检查点结构代码都在底部,读取代码需要大量的跳跃和下来.此外,这些示例中的所有代码都会针对我想要创建的每个检查点重复,并且它们都具有完全相同的结构.
我不禁想到这里有一个优雅的解决方案,只需要少量的重复代码,而且大部分都是可读的.
为什么不进一步将其提取到函数中以避免所有重复代码?
def pickle_function(pickle_filename, data_function):
with open(pickle_filename, 'wb') as f:
try:
data = pickle.load(f)
except:
data = data_function()
pickle.dump(data, f)
if PICKLE:
pickle_function('pickle1.pkl', generateData1)
# Some intermediate logic before next 'checkpoint'
if PICKLE:
pickle_function('pickle2.pkl', generateData2)
Run Code Online (Sandbox Code Playgroud)
此外,我不确定Exception您在打开文件时捕获的内容,因此如果文件可能不存在,您可能需要重新组织.捕获特定的异常(例如except FileNotFoundError:)总是一个好主意,以便大声提出任何意外行为.
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |