问题:如何组织一个依赖于许多外部数据才能工作的大函数。我应该声明一个类并包含那些外部数据吗?还是应该将大函数及其数据保存在一个文件中?或者有更好的方法?计算效率最高的方法是什么?推荐的最蟒蛇的方式是什么?
我有一个要解析的日志文件,该日志文件包含许多格式的字符串。我编写了一个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
块中的功能移动到其自己的函数中,这样您就可以创建parseFoo
和parseBar
函数,它们占用一行,并返回期望值。
这样做的主要好处是现在您可以使用极其简单的功能进行单元测试!
我注意的其他事情是:
- 你做了很多条件句的嵌套吗?提前提取到函数和
return
中,以减少嵌套 - 如果你用不同的输入重复自己,提取到一个函数中
- 一天后在脑海中扫描这个函数,看看我是否还能很容易地得到它。如果不是,则提取较小的位
无论如何,你的更多投入是理想的,但我希望这能帮助你开始!