Python最佳模块导入实践

时间:2019-02-28 16:24:46

标签: python module python-import

我有一个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中吗?

2 个答案:

答案 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)