以下是一个场景:
我最初的(可怕的)方法是:
ModuleA
从数据库中获取句子,并在每个句子中调用functionB
。FunctionB
的ModuleB
从文件中填充字典。每一次。然后它处理句子。这样做是因为我最初分别测试了ModuleB
。后来,当FunctionB
被反复调用时,我不得不解决这个问题。我的解决方案是将字典的数量从文件移动到单独的函数并设置全局字典。代码如下:
ModuleA
import ModuleB
def main():
sentences = getSentencesFromDB()
for (sentence in sentences):
functionB(sentence)
ModuleB
dictionary = makeDictionaryFromFile()
def functionB(sentence):
for word in sentence.split():
#process sentence using dictionary
现在我的问题是:
dictionary
何时填充?第一次打电话给functionB
?或者在导入ModuleB
?答案 0 :(得分:2)
这是一个很好的解决方案;你肯定不想多次读取文件(假设你不希望文件的内容在中途改变)。
您可以将其称为_dictionary
,以表明它是其他人无法访问的私人字段。
或者你可以使用memoizing @decorator
来隐藏调用者的这种行为,或者像chthonicdaemon建议的那样将_dictionary
和makeDictionaryFromFile()
包装在一个类中。
但是对于一次性这两个选项都是矫枉过正的,只需将文件读入一个字段并使用它。
答案 1 :(得分:2)
按顺序解决您的问题。
这肯定是 正确答案。该文件只读一次。可能还有其他正确答案。对于像这样的小程序,您的解决方案就足够了。
为了工作,dictionary
变量需要将其值从一次调用持续到functionB
到下一次,这排除了dictionary
local < / em>到那个功能。作为替代方案,你可以像@ dimo414建议并使用memoizing decorator
那样,或者你可以定义一个类,并使字典成为该类对象的属性(如@cthonicdaemon建议的那样)。另一种方法是将字典文件读入数据库表,然后在functionB
中查询数据库中所需的单词。对于非常大的字典,这可能会以速度为代价提高内存效率。老实说,鉴于你的程序的大小,所有这些选项似乎有点矫枉过正。我建议重构其中一个,当它变得更清楚哪一个更有意义,如果那个时候到来的话。另请注意,这些都不是互斥的。如果你愿意,你可以将这三者结合起来。
在导入模块时,将填充字典作为模块中的顶级变量。
答案 2 :(得分:2)
(1)您现在的方式确保文件只读一次。但是,如果不执行ModuleB中的所有其他代码,在同一次执行ModuleA期间重新读取文件会更加棘手
(2)我会考虑使用一个像这样的对象
class Parser(object):
def __init__(self, filename='whatever the default filename is'):
self.dictionary = makeDictionaryFromFile(filename)
def functionB(self, sentence):
for word in sentence.split():
# process sentence using self.dictionary
def main():
sentences = getSentencesFromDB()
parser = Parser()
for (sentence in sentences):
parser.functionB(sentence)
(3)在您的方法中,导入dictionary
时会填充ModuleB
。