【发布时间】:2016-08-24 13:01:39
【问题描述】:
所以我有一些像这样的python代码
import mymodule
sum_global= mymodule.populateGlobalList("bigdict.txt")
等等... mymodule 中的代码,包括方法
def populateGlobalList(thefile):
#do the stuff
到目前为止一切正常。
但是在 mymodule 的其他地方我有一个方法说
def usefulFunction(arg1, arg2):
#lotsofstuff
if arg1 not in sum_global:
#add to list
所以解释器会在未定义的 sum_global 上跳闸,这是有道理的。现在,有用的函数可以只接受 sum_global 作为参数,至少在理论上是这样。但是 sum_global 是一个英语词典,广泛用于检查遇到的单词是否是英语单词(或至少拼写正确)。由于这种情况经常发生,因此将其设置为本地会让人感到不必要的尴尬。
另一方面,只是在模块中声明一个全局sum_global(本质上是为了欺骗解释器),目的是在导入mymodule的程序中填充这个空容器strong>,感觉完全不对。
针对这种情况的声音设计是什么?
【问题讨论】:
-
全局变量是每个模块。将
sum_global放入mymodule或将其作为参数传递给函数。 -
我不确定它是否完全有意义,但您可以将其设为一个类并将
sum_global设为类属性,然后在usefulFunction中仅引用self.sum_global。跨度> -
不确定这是否是您要查找的内容,但如果您在函数 def 的
kwargs列表中默认提供一个对象,则该对象会创建一次,然后始终作为默认,例如usefulFunction(arg1, arg2, _cached_list={}). -
@dan-man:问题是
populateGlobalList()接受了一个论点。所以这个值并不是那么全局的,因为不同的文件可能会有不同的结果。如果有另一个模块调用populateGlobalList('anotherbigdict.txt')怎么办? -
@MartijnPieters - 在不了解更多细节的情况下,很难说我的建议是否合适。原则上,您可能希望完全删除
populateGlobalList,而是将文件名传递给usefulFunction,然后将所有内容存储在缓存对象中,由文件名和arg1索引。即让你懒惰地“填充”列表。
标签: python global python-module