首页 > 解决方案 > Python 最佳模块导入实践

问题描述

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

所以目标是调用 mymodule.auth() 一次,每次我运行 simple_program 来刷新 JSON 文件。我不知道如何实现这一点。因为 myprogram.py 也是一个模块,我从另一个 .py 文件调用 simple_program() 。那么我在哪里放置 mymodule.auth()?可以将 mymodule.auth() 放在 simple_program 中吗?

标签: pythonmodulepython-import

解决方案


在您导入 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()再次执行。


推荐阅读