Python,如何组织一个依赖于许多外部数据才能工作的大函数



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

我有一个要解析的日志文件,该日志文件包含许多格式的字符串。我编写了一个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()逐行解析文件。

我觉得我的问题是。。。不是堆栈溢出ic,但如果你要评论我应该如何问一个更窄/特定的问题,那就太好了!但也请至少提及你将如何处理我的问题。

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

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

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中,以减少嵌套
  • 如果你用不同的输入重复自己,提取到一个函数中
  • 一天后在脑海中扫描这个函数,看看我是否还能很容易地得到它。如果不是,则提取较小的位

无论如何,你的更多投入是理想的,但我希望这能帮助你开始!

最新更新