处理未定义的全局模块(python)

时间:2016-04-29 11:24:51

标签: python global python-module

所以我有一些像这样的

的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的程序中填入这个空容器,感觉完全错了。

这种情况的声音设计是什么?

1 个答案:

答案 0 :(得分:1)

每个模块都有自己的全局命名空间。您已将sum_global添加到错误的模块中,但它并未存在于mymodule中。

sum_global放入mymodule或将其作为参数传递给需要它的函数。

听起来好像你想推迟计算sum_global值,直到你有一个文件名;你可以让populateGlobalList()在这里设置全局;这完全在mymodule

sum_global = None

def populateGlobalList(filename):
    global sum_global
    if sum_global is None:
        sum_global = "result of your population work"

此函数不返回数据,它在模块中设置全局变量(假设它尚未设置)。

但是,你应该尝试避免创建像这样的全局变量。由于模块的用户必须提供文件名,如果用户代码跟踪populateGlobalList()调用的结果并且显式将其传递给usefulFunction()`call:< / p>

import mymodule

sum_global = mymodule.populateGlobalList("bigdict.txt")

result = mymodule.usefulFunction(arg1, arg2, sum_global)

和retool usefulFunction()需要这样的论证。

下一步将是您的模块使用

class MyClass(object):
    def __init__(self, filename):
        self._populate()

    def _populate(self):
        self.sum = "result of your population work"

    def useful_function(self, arg1, arg2):
        # do work with self.sum

然后到处使用该课程:

 interesting_object = mymodule.MyClass('bigdict.txt')
 result = interesting_object.useful_function(arg1, arg2)