【问题标题】:Dealing with undefined global in module (python)处理模块中未定义的全局(python)
【发布时间】: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


【解决方案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() 调用的结果并显式将其传递到有用的Function()`调用中会更好:

import mymodule

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

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

并重组 usefulFunction() 以要求这样的论点。

下一步是让您的模块为此使用 class:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2020-07-19
    • 2015-02-27
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多