Python,如何组织一个依赖很多外部数据来工作的大函数

Python, How to organize a big function that relies on many external data to work

问题:如何组织一个依赖大量外部数据工作的大函数。我应该声明一个 class 并包含那些外部数据吗?还是应该将大函数及其数据保存在一个文件中?或者有更好的方法吗?计算效率最高的方法是什么?什么是最 pythonic 的推荐方式?

我有一个日志文件要解析,日志文件包含多种格式的字符串。我写了一个 parseLine(inputStr) 函数来处理所有可能的格式。 parseLine() 函数需要许多预编译的正则表达式,以及用于查找的相当大的字典。我将 parseLine() 函数保存在文件 parseLineFile.py

我的 parseLineFile.py 看起来像:

regex0 = re.compile('foo')
regex1 = re.compile('bar')
# and many more regexes

set0 = {'f', '0'}
set1 = {'b', 'a'} # could be a big set contains 10s of strings
# and many more sets

def parseLine(inputString, inputDictionary, inputTimeCriteria):
    # pseduo code:
    #   use regex0 to extract date info in inputString
    #   check if date within inputTimeCriteria
    #   use more of previous declared regexes and sets to extract more info, 
    #       branch out to different routines to use more regexes and sets to extract more info
    #   finally use inputDictionary to look up the meaning of extracted info    
    #   return results in some data structure

在我的主代码中,我导入 parseLineFile.py
构建 myDictionary,确定 mytimeCriteria,然后使用 parseLine() 逐行解析文件。

我觉得我的问题是...不是 stack-overflow-ic,但如果您要就我应该如何提出 narrower/specific 问题发表评论,那就太好了!但也请至少提及您将如何解决我的问题。

很难具体告诉你你应该为这个特定的功能做什么,但是关于组织大功能的一些提示:

首先,确定哪些条件可以移动到它们自己的函数中。例如,假设您有以下代码:

if 'foo' in inputString:
   line = regex()
   line = do_something_else()
elif 'bar' in inputString
   line = regex()
   line = do_something_a_little_different()

你可以很容易地看到你可以在这里做的一个抽象,那就是将每个 if 块中的功能移动到它自己的函数中,所以你会创建 parseFooparseBar需要一条线的函数,return一个期望值。

这样做的主要好处是现在您可以使用极其简单的函数进行单元测试!

我要注意的其他事情是:

  • 你有很多条件嵌套吗?提早提取到函数中并return,以减少嵌套
  • 如果你用不同的输入重复自己,提取到一个函数中
  • 一天后在心里扫描一下这个函数,看看我是否仍然很容易理解它。如果不是,请提取成更小的位。

无论如何,如果您能提供更多信息是最理想的,但我希望这有助于您入门!