避免在python util文件中使用全局变量

时间:2016-06-14 21:49:11

标签: python

我的python项目有一个 utilities.py 文件。它仅包含util函数,例如is_float(string)is_empty(file)等。

现在我想要一个函数is_valid(number),它必须:

  1. 从文件 valid.txt 中读取,其中包含所有有效的数字,并将其加载到地图/集上。
  2. 检查地图是否存在number并返回True或False。
  3. 经常调用此函数,运行时间应尽可能小。每次调用函数时,我都不想读取打开并阅读 valid.txt 。我提出的唯一解决方案是使用全局变量valid_dict,当 valid.txt utilities.py 加载一次>是导入的。加载代码在 utilities.py 中写为main。

    我的问题是如何在不使用全局变量的情况下执行此操作,因为它被认为是不好的做法?在不使用全局变量的情况下执行此类任务的好设计模式是什么?还要注意这是一个util文件,所以理想情况下应该没有main,只是函数。

2 个答案:

答案 0 :(得分:4)

以下是闭包的简单示例。字典 var bypass_ajax = true; $.ajax( { url: destination_url, data: { a:a, b:b }, type: 'POST', success: function ( e ) { if( bypass_ajax == true ) { alert( 'Ajax request was manually bypassed, yet you can still read me...' ); } } }); 封装在外部函数(cache)中,但仍保留在内部范围内,即使返回它也是如此。请注意,load_func将内部函数作为对象返回,它不会调用它。

load_func

utilities.py

def _load_func(filename): cache = {} with open(filename) as fn: for line in fn: key, value = line.split() cache[int(key)] = value def inner(number): return number in cache return inner is_valid = _load_func('valid.txt')

__main__

字典(from utilities import is_valid # or something similar if is_valid(42): print(42, 'is valid') else: print(42, 'is not valid') )的创建可以使用字典理解来完成,但我希望你专注于闭包。

答案 1 :(得分:3)

变量valid_dict不是全局变量,而是utilities.py的本地变量。只有你做from utilities import *这样的事情,它才会变得全球化。现在 在开发软件包时被认为是不好的做法。

但是,我在这种情况下使用了一个技巧,基本上需要一个静态变量:向[{1}}添加一个参数valid_dict={}。此字典仅实例化一次,每次调用该函数时is_valid()都可以使用dict

valid_dict

NOT 分配给def is_valid(number, valid_dict={}): if not valid_dict: # first call to is_valid: load valid.txt into valid_dict # do your check - 子句中的valid_dict,但仅修改:例如,通过设置密钥if或使用像valid_dict[x] = y这样的东西。

(PS:如果这被认为是“脏”或“非pythonic”,请告诉我。)