我有一个python模块mymodule.py:
def auth():
'''Authorize and generate a JSON file'''
return j
j = auth()
def get_value(key):
'''Takes the key and return value from JSON'''
value = j[key]
return value
我有一个程序在其中使用此模块myprogram.py:
import mymodule
keys = [1,2,3,4,5]
def simple_program(keys):
# mymodule.auth() should I place it here?
for key in keys:
value = mymodule.get_value(key)
return value
因此,目标是每次我运行simple_program刷新JSON文件时都调用一次mymodule.auth()。我不知道该如何实现。因为myprogram.py也是一个模块,所以我从另一个.py文件中调用simple_program()。那么我该在哪里放置mymodule.auth()?可以将mymodule.auth()放在simple_program中吗?
答案 0 :(得分:0)
导入mymodule时,下面的代码将立即运行
j = auth()
这就是为什么当您调用mymodule.get_value()
时它起作用的原因。这导致J是全局空间中的单例。每次导入时,auth()
将再次运行。这可能是不好的。
这是您可以做的:
def auth():
'''Authorize and generate a JSON file'''
return j
j = None
def get_value(key):
global j
'''Takes the key and return value from JSON'''
if not j:
j = auth()
value = j[key]
return value
现在,您只需要运行get_value()
,一切都会正常运行。无需再次执行auth()
。
答案 1 :(得分:0)
您的确切用例有点模糊(例如,simple_program不是主程序,但是像子例程一样吗?它被另一个py文件调用了几次?),但是在我看来,您应该熟悉类。我建议将auth()
作为一个类来实现,例如像这样:
class MyJson(object):
def __init__(self):
self._json = ... # do authorization and generation here and save the result as member
def get_value(self, key):
value = self._json[key]
return value
现在,无论您何时需要,都可以导入并创建该类的对象
from mymodule import MyJson
# ...
my_json = MyJson()
如果只需要将其初始化一次,则在主程序中执行此操作,然后将my_json
对象作为参数传递给simple_program
(可能也应该是一个类)。然后像这样使用它
value = my_json.get_value(key)