Как экспортировать результат выполнения из другого модуля в python?

Привет,

Есть некая структура:
\main.py
\api\module1\function1.py
\api\module1\function2.py
\api\module2\function3.py

В \main.py Я создаю инстанс классов из \api\*. Проблема в том, что мне нужно передать назад в \api\module1\function1.py некий результат выполнения декоратора @register из \api\module1\function1.py .

Листинг main.py:

def calculate(instance, salt):
    return instance.salt(salt=salt)

pool = []
import api.settings
from api.module1.function1 import Class1
instance1 = Class1(conf=api.settings.conf)
result = calculate(instance1, ["some"])
pool.append(result)
print pool

\api\module1\function1.py
def register(path,
             method="GET",
             content_type="application/json",
             parameters=[],
             responseMessages=[],
             nickname=None,
             notes=None,
             bp=None):
    def inner_func(f):
        print (path, f, method, content_type, parameters,
                       responseMessages, nickname, notes, bp)
    return inner_func

class Class1(object):
    @register("/api/v1/cheese1/<cheeseName>",
      parameters=[
        ApiParameter(
            name="cheeseName",
            description="The name of the cheese to fetch",
            required=True,
            dataType="str",
            paramType="path",
            allowMultiple=False)
      ],
      responseMessages=[
        ApiErrorResponse(400, "Sorry, we're fresh out of that cheese.")
      ])
    def salt(salt=None):
         return salt
  • Вопрос задан
  • 334 просмотра
Пригласить эксперта
Ответы на вопрос 1
Bahusss
@Bahusss
Python Master
Если я правильно понял вопрос, вам необходимо добавить некое глобальное хранилище, где вы сможете сохранять результаты выполнения декоратора register. В простом случае выглядеть это может так:

создаете рядом с main.py новый файл, допустим api_routing.py со следующим содержимым:
# здесь может быть структура и посложнее, все зависит от потребностей
# если планируется использование тредов, то возможно лучшим вариантом будет threading.local
# или это может быть объект с методом add например
API_ROUTING_TABLE = {}

Далее в файле \api\module1\function1.py:
# в PYTHONPATH должна быть добавлена директория где лежит api_routing.py 
# это можно сделать разными способами, 
# подробнее здесь https://docs.python.org/2/tutorial/modules.html#the-module-search-path
from api_routing import API_ROUTING_TABLE

# использовать изменяемые структуры данных в параметрах по умолчанию - плохой тон и поле для ошибок
def register(path,
             method="GET",
             content_type="application/json",
             parameters=(),
             responseMessages=(),
             nickname=None,
             notes=None,
             bp=None):
    def inner_func(f):
        # сохраняем информацию об API-вызове в глобальную переменную
        API_ROUTING_TABLE[path] = {'method': method, 'content_type': content_type, ...}

        print (path, f, method, content_type, parameters,
                       responseMessages, nickname, notes, bp)
    return inner_func

теперь в main.py вы можете написать:
# эти импорты обязательны в начале, если их не будет то API_ROUTING_TABLE не заполнится
from api.module.function1 import Class1

from api_routing import API_ROUTING_TABLE
print API_ROUTING_TABLE


Таким образом переменную API_ROUTING_TABLE можно импортировать в любом месте вашего кода, главное чтобы до этого импорта где-нибудь раньше обязательно были заимпорчены модули, в которых применяется декоратор register.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы