Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 10.10.2022
Сообщений: 11

Организация кода

10.12.2022, 22:07. Показов 772. Ответов 2

Студворк — интернет-сервис помощи студентам
Пишу апи веб-сервер на основе FastApi, и столкнулся с проблемой "засорения" кода. С питоном особо не знаком, но кажется что проблема организации кода может быть решена инструментарием или особенностями самого языка.
Вот есть у меня такая функция:

services.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
async def connect_db_or_create_if_not_exists(host: str, database: str, user: str, password: str):
    try:
        conn = await asyncpg.connect(user=user, password=password, host=host, database=database)
        _uuid = add_connection(conn)
        error_msg = {"Error": 110,
                     "Msg": f'Database <{database}> already exists! Connection established!',
                     "Host": host,
                     "Database": database,
                     "UniqueIdentifier": _uuid}
    except asyncpg.InvalidCatalogNameError:
        # Database does not exist, create it.
        sys_conn = await asyncpg.connect(
            database='template1',
            user=user,
            password=password
        )
        await sys_conn.execute(
            f'CREATE DATABASE "{database}" OWNER "{user}"'
        )
        await sys_conn.close()
 
        conn = await asyncpg.connect(user=user, password=password, database=database)
 
        _uuid = add_connection(conn)
        error_msg = {"Error": 100,
                     "Msg": f'Database {database} created successfully! Connection established!',
                     "Host": host,
                     "Database": database,
                     "UniqueIdentifier": _uuid}
    except gaierror:
        error_msg = {"Error": 400,
                     "Msg": f'Host <{host}> not found!',
                     "Host": host}
        return error_msg
    except InvalidPasswordError:
        error_msg = {"Error": 401,
                     "Msg": f'Invalid password!',
                     "Host": host,
                     "Database": database}
 
    return error_msg
Эта функция вызывается внутри метода FastApi
api.py
Python
1
2
3
4
@app.post("/create_db/cstr")
async def check_create_db(host: str = 'localhost', db: str='my_db', user: str='user', password: Union[str, None] = 'password'):
    error_msg = await connect_db_or_create_if_not_exists(host=host, database=db, user=user, password=password)
    return error_msg
Приходит rest-запрос, сервер коннектится к базе если она есть, либо создает ее и коннектится. Сервисная функция возвращает словарики, чтобы потом эти словарики улетели тому кто запрос послал. Как видно, у этой функции внутри уже прописаны эти словарики на каждый (почти) случай (база уже есть, база создана и готова, не найден хост, ошибка аутентификации). Что мне тут не нравится: вот эти вот словарики занимают 50% "места" и забивают собой действительно рабочие строки. Читаемость и восприятие кода снижается. Мало того, что некоторые словари повторяются, некоторые еще и имеют разное количество пар. На мой взгляд, ответы юзеру должны формироваться в функциях fastapi, а не где-то в кишках web-сервера. Можно ли как-то причесать код, чтобы эти словари, например, можно было описать в отдельном файле и вызывать готовый словарь по коду Error? Я подумал создать отдельный файл, а все эти ошибки описать в отдельных классах, и тогда получилось что-то вроде Error(100).desc(host, database, password),но чо-то тоже какая-то дичь получается. Каждый экзепшн умотаешься в классе разрисовывать, да и зависимость от типа остается (количество пар разное) + в Msg мне надо подставлять некоторые значения. Есть какие-нибудь красивые варианты?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2022, 22:07
Ответы с готовыми решениями:

Организация кода. Проектирование кода
Доброго времени суток! Появилось желание реализовать в учебных целях библиотеку для связанных списков, очередей, стеков. Возник ряд...

Организация кода
Задача такая: Открывается окно, где требуется ввести путь до БД. Вводишь правильный путь, затем проверяется есть ли определённые таблицы в...

Организация кода
Здравствуйте. Подскажите пожалуйста что почитать по организации кода и ООП, желательно конкретно про JS, ну или про ООП в общем. Только...

2
 Аватар для rim41
1045 / 313 / 78
Регистрация: 16.03.2020
Сообщений: 954
11.12.2022, 04:39
Цитата Сообщение от АВОЛ Посмотреть сообщение
эти словари, например, можно было описать в отдельном файле
Вообще не рассматривал код, предположу что поможет создание dicts.py, в которому будут лежать все нужные словари, потом импортировать dicts.py и в дальнейшем обращаться уже к нему

Добавлено через 8 минут
Типа
dicts.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
error_msg_try = {"Error": 110,
                     "Msg": f'Database <{database}> already exists! Connection established!',
                     "Host": host,
                     "Database": database,
                     "UniqueIdentifier": _uuid}
 
invalid_catalog_name_msg = {"Error": 100,
                     "Msg": f'Database {database} created successfully! Connection established!',
                     "Host": host,
                     "Database": database,
                     "UniqueIdentifier": _uuid}
 
gaierror_msg = {"Error": 400,
                     "Msg": f'Host <{host}> not found!',
                     "Host": host}
 
invalid_pass_msg = {"Error": 401,
                     "Msg": f'Invalid password!',
                     "Host": host,
                     "Database": database}
services.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import dicts.py as errors
 
 
async def connect_db_or_create_if_not_exists(host: str, database: str, user: str, password: str):
    try:
        conn = await asyncpg.connect(user=user, password=password, host=host, database=database)
        _uuid = add_connection(conn)
        error_msg = {"Error": 110,
                     "Msg": f'Database <{database}> already exists! Connection established!',
                     "Host": host,
                     "Database": database,
                     "UniqueIdentifier": _uuid}
    except asyncpg.InvalidCatalogNameError:
        # Database does not exist, create it.
        sys_conn = await asyncpg.connect(
            database='template1',
            user=user,
            password=password
        )
        await sys_conn.execute(
            f'CREATE DATABASE "{database}" OWNER "{user}"'
        )
        await sys_conn.close()
 
        conn = await asyncpg.connect(user=user, password=password, database=database)
 
        _uuid = add_connection(conn)
        error_msg = errors.error_msg_try
    except gaierror:
        error_msg = errors.gaierror_msg
        return error_msg
    except InvalidPasswordError:
        error_msg = errors.invalid_pass_msg
 
    return error_msg
0
1 / 1 / 0
Регистрация: 10.10.2022
Сообщений: 11
11.12.2022, 09:17  [ТС]
надо передавать туда данные. такой подход к сожалению не подходит. к слову, первое что я и сделал это и было таким решением
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.12.2022, 09:17
Помогаю со студенческими работами здесь

Правильная организация кода
Здравствуйте! У меня возник вопрос по поводу правильного написания программы. Сейчас, я пишу небольшое консольное приложения для работы с...

Организация кода по категориям
Всем привет :senor:

Организация кода в WinForms приложении
Доброго времени суток. Пишу учебный проект и в процессе рефакторинга возник следующий вопрос: как лучше организовать код в приложении...

Организация кода в Tornado. WebSocket
Добрый день. Работаю на python 3.4 Осваиваю вебсокеты в tornado. У меня есть такой код (месенджер): import redis ...

Правильная организация кода в проекте
Доброго дня! При создании проекта для Windows генерятся два файла - файл формы и файл программы. Абсолютно во всех учебниках практикуется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru