格式化,如果尝试除了else代码块

bka*_*uka 2 python layout readability

我正在编写一个包含许多步骤和大量数据的数据分析程序.有时我想在途中保存泡菜,有时候不是.我将把这些保存称为"检查站".

如果咸菜文件是可读的,和一个全局变量PICKLETrue,我可以跳过一些分析步骤.布局代码的一种愚蠢但冗长的方式是这样的:

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)

现在每个"检查点"都会重复更少的代码,但是这一点非常难看,并且通过将所有函数放在顶部,并且所有流控制和检查点结构代码都在底部,读取代码需要大量的跳跃和下来.此外,这些示例中的所有代码都会针对我想要创建的每个检查点重复,并且它们都具有完全相同的结构.

我不禁想到这里有一个优雅的解决方案,只需要少量的重复代码,而且大部分都是可读的.

Ewa*_*wan 5

为什么不进一步将其提取到函数中以避免所有重复代码?

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:)总是一个好主意,以便大声提出任何意外行为.