Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Как сделать эту функцию более короткой не теряя функционала?

#python #python_3x #инспекция_кода #python_2x


def addToDb(list):
    if type(list[0]) == str:
        if type(list[1]) == str:
            if type(list[2]) == str:
                if type(list[3]) == int:
                    cursor.execute("""INSERT INTO clients VALUES (?, ?, ?, ?)""",
(list[0], list[1], list[2], list[3]))
                    conn.commit()
                    print('Выполнена запись в базу данных')
                else:
                    print('Аргумент number не является Int ')
            else:
                print('Аргумент time не является Str')
        else:
            print('Аргумент ip не является Str')
    else:
        print('Аргумент status не является Str')

    


Ответы

Ответ 1



In [101]: lst = ['a','b','c',1] проверка на "строки" первых трех элементов: In [104]: all(isinstance(x, str) for x in lst[:3]) Out[104]: True проверка четвертого элемента на "int": In [105]: isinstance(lst[3], int) Out[105]: True Немного улучшенный ответ: In [135]: lst = [1,'b',2,'x'] In [136]: chk_type = ( ...: ['status', str], ...: ['ip', str], ...: ['time', str], ...: ['number', int] ...: ) ...: In [137]: for i,x in enumerate(chk_type): ...: if not isinstance(lst[i], x[1]): ...: print('parameter [{}] has wrong type (should be [{}])!'.format(x[0], x[1].__name__)) ...: parameter [status] has wrong type (should be [str])! parameter [time] has wrong type (should be [str])! parameter [number] has wrong type (should be [int])!

Ответ 2



Явную проверку типов во время исполнения редко в Питоне нужно делать. Как правило это указывает на ошибку в дизайне кода. Как валидировать входные данные зависит от задачи. По известным спискам значений (whitelisting), схеме. К примеру, cerberus. Часто можно упростить код до: def add_to_db(*args): with conn: conn.execute("INSERT INTO clients VALUES (?, ?, ?, ?)", args) Если не произойдёт исключения, то происходит commit. Для проверки типов аргументов, можно использовать аннотации типов, читаемые статическим анализатором типа mypy и/или декоратор, чтобы во время исполнения аргументы валидировать (не тестировано): from typing import NamedTuple import enforce # $ pip install enforce class Client(NamedTuple): status : str ip : str time : str number : int @enforce.runtime_validation def add_client(client : Client) -> None: with conn: conn.execute("INSERT INTO clients VALUES (?, ?, ?, ?)", client) Связанный вопрос: How to use Python decorators to check function arguments? Если вы такой код часто пишите, то попробуйте ORM. Вот пример кода для SQLAlchemy: my_client = MyClient(status, ip, time, number) session.add(my_client) session.commit() SQLAlchemy по умолчанию опирается на базу данных как на самый эффективный и надёжный источник о корректности данных, но вы можете и свои проверки добавить How can I verify Column data types in the SQLAlchemy ORM?

Комментариев нет:

Отправить комментарий