Практика импорта лучших модулей Python - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть модуль 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 также является модулем, и я вызываю simple_program () из другого файла .py.Итак, где я могу разместить mymodule.auth ()?Можно ли разместить mymodule.auth () внутри simple_program?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Ваш точный вариант использования немного расплывчатый (например, 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)
0 голосов
/ 28 февраля 2019

В момент, когда вы импортируете мой модуль, код, приведенный ниже, запускается

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() снова.

...