这是一个场景:
- 我从数据库 (MySQL) 中获取句子列表。
- 我将文件读入字典。
- 根据字典处理每个句子。
我最初的(糟糕的)方法是:
- 有两个模块。
ModuleA从数据库中获取句子并为每个句子调用functionB。FunctionB从文件中填充字典。每一次。然后它处理句子。
ModuleB 中的
这样做是因为最初我是单独测试 ModuleB 的。后来,当 FunctionB 被重复调用时,我不得不解决这个问题。我的解决方案是将字典的填充从文件移动到一个单独的函数并设置一个全局字典。代码如下:
模块A
import ModuleB
def main():
sentences = getSentencesFromDB()
for (sentence in sentences):
functionB(sentence)
模块B
dictionary = makeDictionaryFromFile()
def functionB(sentence):
for word in sentence.split():
#process sentence using dictionary
现在我的问题是:
- 这是解决我的问题的正确方法吗?也就是说,这是否确保文件只被读取一次?
- 有没有更好的方法来做到这一点(也许不使用 global)。
- 什么时候填充
字典?第一次调用functionB时?或者在导入ModuleB时?
请您参考如下方法:
按顺序回答您的问题。
肯定是 正确答案。该文件将只被读取一次。也可能有其他正确答案。对于像这样的小程序,您的解决方案就足够了。
为了工作,
dictionary变量需要其值从对functionB的一次调用持续到下一次调用,这排除了将dictionarylocal 该函数。作为替代方案,您可以按照@dimo414 的建议并使用内存装饰器,或者您可以定义一个类,并使字典成为该类对象的属性(如@cthonicdaemon 所建议的)。另一种方法是将字典文件读入数据库表,然后在functionB中查询数据库以获取所需的单词。对于非常大的词典,这可能会以速度为代价提高内存效率。老实说,考虑到您的程序的大小,所有这些选项似乎都有些矫枉过正。如果那个时候到来,我建议重构其中一个,当它变得更清楚哪个更有意义时。另请注意,这些都不是相互排斥的。如果需要,您可以将这三者结合起来。字典是模块中的顶级变量,在导入模块时填充。
