我的python项目有一个 utilities.py
文件。它仅包含util函数,例如is_float(string)
,is_empty(file)
等。
现在我想要一个函数is_valid(number)
,它必须:
valid.txt
中读取,其中包含所有有效的数字,并将其加载到地图/集上。number
并返回True或False。经常调用此函数,运行时间应尽可能小。每次调用函数时,我都不想读取打开并阅读 valid.txt
。我提出的唯一解决方案是使用全局变量valid_dict
,当 valid.txt
utilities.py
加载一次>是导入的。加载代码在 utilities.py
中写为main。
我的问题是如何在不使用全局变量的情况下执行此操作,因为它被认为是不好的做法?在不使用全局变量的情况下执行此类任务的好设计模式是什么?还要注意这是一个util文件,所以理想情况下应该没有main,只是函数。
答案 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”,请告诉我。)