比方说,我有这样的过程:这段代码可以做成一个函数或以某种方式简化吗?
found = 0
print_header()
for file in files_to_check
print("Checking file: {}".format(file), end="")
with open(file) as f:
line_counter = 0
for line in f:
line_counter += 1
print("-- Checking line: {}".format(line_counter), end="")
# MY CHECK:
# Some complex code that either increments "found" or not
print("done with line")
print("done with file")
print("FOUND:", found)
print_footer()
而且我们说,我要一遍又一遍做到这一点。也就是说,我有不同的“检查”来运行。其中一些很简单,有些很复杂。但它们都具有相同的基本结构:遍历每个文件(每次打开或关闭文件时打印一行),并遍历每行(打印行号),在每行执行一些操作,然后执行在开始下一次迭代之前,在每行之后进行一些打印和填充。
我希望能够尽可能多地将这些内容抽象为函数或方法(即打印文件名,行计数器,打开和关闭文件,循环遍历每行),以便我可以定义一系列包含我支票核心的功能(或类)。
在伪代码中,我认为它是一种部分定义的方法,其中中间的“检查”代码将留空。然后,我可以根据需要多次实例化此类,并将一些自定义代码插入到每个实例的check()方法的中间。
这样的构造是否可以在Python中使用?我研究了抽象基类,这看起来很有帮助,但似乎没有包含任何与我一样寻找的东西。
编辑:
中抽象出这个代码的困难(在我看来)是,它是在一系列文件(with open(file) as f
),然后在循环线路经营。上例中标有# MY CHECK
的部分是需要发生许多不同事情的地方。为了弥补一些简单的例子,比方说,我想通过每个文件的每一行和:
- 增量,如果该行包含单词“foobar的”
- 打印如果行包含的值的计数器语法“Hello”,
- 如果单词“python”在这一行,并且我们已经在文件的前面看到单词“Apache”,则打印“LAMP”。
- ...
- ...
不过,我不希望运行上的所有文件,这些检查所有。我可能想运行#1和#3。明天,为了满足不同的商业需求,我可能要运行#1,#4和#23。因此,我需要将每个“检查”作为自己的功能或自己的方法。
我试图做的是不必重复包围各检查(建立文件,打开它们,打印页眉和页脚等)
是你可以把它变成一个功能....你试过,你面对的问题?复杂的代码究竟是什么? – depperm
每个抽象级别应该放在一个不同的函数中。 – Ioan
我不确定抽象基类如何帮助你在这里,甚至是类。你的代码看起来非常适合一个函数。也许你没有意识到,但函数是Python中的第一类对象,可以作为参数传递给函数,也可以从函数返回。 –