CrazzyDi
@CrazzyDi

Как передать переменную из декоратора в функцию не изменяя эту функцию?

У меня есть несколько функций для операций с БД по SSH.
Функции эти выглядят следующим образом:

from sshtunnel import SSHTunnelForwarder
from pymongo import MongoClient

def get_users_mongo(user):
    
    server = SSHTunnelForwarder(
        '192.168.20.10',
        ssh_username='username',
        ssh_password='password',
        remote_bind_address=('127.0.0.1', 27017))

    server.start()

    client = MongoClient('127.0.0.1', server.local_bind_port)
    db = client['database']
    col = db['collection']
    x = col.find_one({'login': user})
    
    del client, db, col
    
    server.stop()

    return x

Общая часть в этих функциях - SSH соединение. Мне хочется вынести эту часть кода в декоратор.
Я попробовал реализовать это так:

def connect_to_mongo(func): 
    def inner(user):
        
        server = SSHTunnelForwarder(
            '192.168.20.10',
            ssh_username='username',
            ssh_password='password',
            remote_bind_address=('127.0.0.1', 27017))
        
        server.start()
        
        func(user)
        
        server.stop()

    return inner


@connect_to_mongo
def get_users_mongo(user):

    client = MongoClient('127.0.0.1', server.local_bind_port)
    db = client['database']
    col = db['collection']
    x = col.find_one({'login': user})
    
    del client, db, col
    
    return x


Можно ли как-то передать server.local_bind_port из декоратора в функцию, не меняя при этом саму функцию?
То есть, чтобы функция get_users_mongo() принимала один позиционный аргумент, а не, например, **kwargs.
  • Вопрос задан
  • 296 просмотров
Решения вопроса 1
Тут скорее напрашивается контекст менеджер.

Примерно так:

@contextmanager
def mongo_connection():
    server = SSHTunnelForwarder(
            '192.168.20.10',
            ssh_username='username',
            ssh_password='password',
            remote_bind_address=('127.0.0.1', 27017))

    server.start()
    yield server
    server.stop()

with mongo_connection() as server:
    client = MongoClient('127.0.0.1', server.local_bind_port)
    ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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