2017-02-16 44 views
0

比方说,我有这样的过程:这段代码可以做成一个函数或以某种方式简化吗?

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的部分是需要发生许多不同事情的地方。为了弥补一些简单的例子,比方说,我想通过每个文件的每一行和:

  1. 增量,如果该行包含单词“foobar的”
  2. 打印如果行包含的值的计数器语法“Hello”,
  3. 如果单词“python”在这一行,并且我们已经在文件的前面看到单词“Apache”,则打印“LAMP”。
  4. ...
  5. ...

不过,我不希望运行上的所有文件,这些检查所有。我可能想运行#1和#3。明天,为了满足不同的商业需求,我可能要运行#1,#4和#23。因此,我需要将每个“检查”作为自己的功能或自己的方法。

我试图做的是不必重复包围各检查(建立文件,打开它们,打印页眉和页脚等)

+3

是你可以把它变成一个功能....你试过,你面对的问题?复杂的代码究竟是什么? – depperm

+0

每个抽象级别应该放在一个不同的函数中。 – Ioan

+1

我不确定抽象基类如何帮助你在这里,甚至是类。你的代码看起来非常适合一个函数。也许你没有意识到,但函数是Python中的第一类对象,可以作为参数传递给函数,也可以从函数返回。 –

回答

2

使用功能参数:

def file_checker(files_to_check, checker): 
    found = 0 
    print_header() 
    for file in files_to_check: 
     print("Checking file: {}".format(file), end="") 
     with open(file) as f: 
      for num, line in enumerate(f, 1): 
       print("-- Checking line: {}".format(num), end="") 
       if checker(line): 
        found += 1 
       print("done with line") 
     print("done with file") 
    print("FOUND:", found) 
    print_footer() 
    return found 

或发电机:

def multi_file_line_iterator(files_to_check): 
    print_header() 
    for file in files_to_check: 
     print("Checking file: {}".format(file), end="") 
     with open(file) as f: 
      for num, line in enumerate(f, 1): 
       print("-- Checking line: {}".format(num), end="") 
       yield line 
       print("done with line") 
     print("done with file") 
    print("FOUND:", found) 
    print_footer() 
    return found 

found = 0 
for line in multi_file_line_iterator(files_to_check): 
    found += checker(line) 
+0

感谢您的详细建议。 –

2

函数是第一类对象的基础设施蟒蛇。 由于每个检查器基本上只需要一个参数(要检查的行),因此可以使用检查器函数作为循环函数的参数。

def test(filename, function): 
    with open(filename) as foo: 
     for line in foo: 
      rv = function(line) 
      print(function.__name__, 'returned:', rv) 
+0

更适合啊!这很有帮助 - 谢谢。 –

相关问题