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
块中的功能移动到它自己的函数中,所以你会创建 parseFoo
和 parseBar
需要一条线的函数,return一个期望值。
这样做的主要好处是现在您可以使用极其简单的函数进行单元测试!
我要注意的其他事情是:
- 你有很多条件嵌套吗?提早提取到函数中并
return
,以减少嵌套
- 如果你用不同的输入重复自己,提取到一个函数中
- 一天后在心里扫描一下这个函数,看看我是否仍然很容易理解它。如果不是,请提取成更小的位。
无论如何,如果您能提供更多信息是最理想的,但我希望这有助于您入门!
问题:如何组织一个依赖大量外部数据工作的大函数。我应该声明一个 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
块中的功能移动到它自己的函数中,所以你会创建 parseFoo
和 parseBar
需要一条线的函数,return一个期望值。
这样做的主要好处是现在您可以使用极其简单的函数进行单元测试!
我要注意的其他事情是:
- 你有很多条件嵌套吗?提早提取到函数中并
return
,以减少嵌套 - 如果你用不同的输入重复自己,提取到一个函数中
- 一天后在心里扫描一下这个函数,看看我是否仍然很容易理解它。如果不是,请提取成更小的位。
无论如何,如果您能提供更多信息是最理想的,但我希望这有助于您入门!