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

时间:2016-04-09 01:55:03

标签: python function class organization

问题:如何组织依赖许多外部数据工作的大功能。我应该声明一个类并包含那些外部数据吗?或者我应该将大功能及其数据保存在一个文件中?或者有更好的方法可以做到这一点?计算效率最高的方法是什么?什么是最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()逐行解析文件。

我觉得我的问题是......不是堆栈溢出,但是如果你要发表一个关于我应该如何问一个较窄/特定问题的评论,这太棒了!但请至少提一下如何处理我的问题。

1 个答案:

答案 0 :(得分:0)

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

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

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,以减少嵌套
  • 如果您正在重复使用不同的输入,请将其解压缩为函数
  • 一天后精神扫描这个功能,看看我是否还能轻松搞定。如果没有,请提取到较小的位。

无论如何,你的更多意见是理想的,但我希望这有助于你的开始!

相关问题