• Почему VS Code не распознает, что функция вернет tuple?

    Vindicar
    @Vindicar
    RTFM!
    Потому что оба оверлоада неразличимы - они ОБА показывают один аргумент типа bool.
    И да, а если аргумент не указан, что вернёт функция? Из твоего кода это неясно вообще, так как у тебя два противоречащих варианта.
    Тебе надо что-то типа...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[False] = False) -> str:
        ...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[True]) -> tuple[str, str]:
        ...
    @classmethod
    def get_mac_address(cls, with_gateway: bool = False) -> typing.Union[str, tuple[str, str]]:
        ...
    Ответ написан
    3 комментария
  • Что изучать python backend разработчику?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что изучать python backend разработчику?

    Вы не совсем верно ставите задачу, не "что изучать", а "какие инструменты выбрать для этой задачи". Если под "python backend разработчику" понимается классическая backend разработка, по типу сервера, для каких либо приложений, то:
    1. Как сделать, чтобы по указанному url отдавалась html страница с таким то данными? Django Writing views. В процессе работы Вы начнете понимать, для чего нужны какие то вьюхи и модели.
    2. Оказалось, что в п1. неудобно вставлять всю страницу, что делать, если мне нужно сделать более сложную html страницу? Используем один из самых популярных шаблонизаторов Jinja for Server-Side Rendering in Django.
    3. Как и где хранить данные? Пробуем SQLite. В процессе работы Вы начнете понимать, для чего нужны какие то ORM.
    4. Выяснилось, что п3 не подходит для моего проекта (почему конкретно?), где еще хранить данные? Пробуем PostgreSQL.
    5. Как сделать простое API на Django? Используем Django REST framework (DRF) или Django Ninja.
    6. Как создать возможность аутентификации пользователей и показ им именно их личной информации? How to use sessions, JWT.
    7. Как быть, если мне приходит запрос с фронта и мне нужно быстро вернуть ответ, а не ждать, пока бэк все обработает? Django Background Tasks.
    8. Задач стало очень много, Django не тянет, надо выполнять все в фоне, п6. уже не подходит (почему конкретно?), что делать? Django Celery.
    9. Как развернуть мой мега сайт на хостинге? Shared хостинг (если VDS много, это жестко конечно, но хозяин - барин). Для VDS идем гуглить, в каком порядке и что надо ставить.
    10. Как сделать автоматическое развертывание несколько проектов на удаленном сервере и нужно ли оно мне (описываем, что, где и в каком порядке нужно развернуть)? Docker + CI/CD.

    В процессе может и админка для бэка понадобиться и много чего еще по мелочи. Опять же - вначале задача, затем поиск инструмента.

    Так же можно гуглить по типу Django Roadmap 2024.
    Ответ написан
    2 комментария
  • Как сделать парсер для excel таблицы?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    В графане экспорт в CSV из коробки есть: график -> Inspect -> Data -> Download CSV. Кроме того, если такой вариант не устраивает - у графаны есть API, по которому можно получить любые данные.
    Ответ написан
    Комментировать
  • Как сделать парсер для excel таблицы?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Подскажите, как написать такой парсер, чтобы разбить информацию по ячейкам.

    1. Запросить данные с сайта используя requests.
    2. Использовать beautifulsoup для парсинга html из п1.
    3. Использовать openpyxl для работы с excel.
    Ответ написан
    Комментировать
  • Как с помощью оконных функций преобразовать таблицу?

    @Olteya
    Я бы отталкивалась от того, что разница между текущим и предыдущим period_id составляет 1 до смены периода. На строке с period_id = 208 вы получите разницу в 2, в следующий раз на строке с period_id = 211.
    Получается, там, где получите значение 2 - это начало нового периода. Предыдущая строка - конец предыдущего периода.
    Соответственно вы можете получить таблицу (или CTE) с данными:
    period_start period_end row_num
    0 206 1
    208 209 2
    211 214 3
    216 218 4
    и сджойнить ее с исходной по условию period_start <=period_id (первой табл.)<= period_end.
    Может быть не оптимальное решение, но в ночи только это пришло в голову :)
    Ответ написан
    Комментировать
  • Python в запущенный в контейнере работает медленнее натива?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    Разница в бинарях - Python на хостовой машине собран без отладочной информации, а тот, который в образе python:3.10.4 собран с нею.

    Выходом из ситуации будет - взять базовый образ Debian и установить в него Python из штатного репозитория с помощью штатного пакетного менеджера, тогда результат теста бенчмарка на хостовой машине и в контейнере не будет отличаться.

    Можно пойти дальше и собрать Python из исходников самому, но самостоятельная сборка это такое себе развлечение (хотя с помощью pyenv делать это довольно просто), а выигрыш не такой уж и значительный - устанавливать бинарные пакеты сильно проще.

    PS
    Никогда не используй образы Alpine - там вместо glibc суррогат под названием musl. В прочем для статически слинкованных бинарей на Go использовать можно, но тогда уж выгоднее использовать scratch
    Ответ написан
    5 комментариев
  • Увеличение списка до нужной длинны в pyhon?

    Maksim_64
    @Maksim_64
    Data Analyst
    Обычно когда мы имеем дело с множеством списков разной длинны и нужно выбрать из каждого по индексу то zip_longest из itertools решает проблему. Способов применения может быть много, простейший выглядит вот так
    from itertools import zip_longest 
    x = [1, 2, 3, 4, 5, 6, 7] 
    y = [8, 9, 10] 
    z = [9, 3, 4, 5]
    list(zip_longest(x,y,z))
    Ну а там в зависимости от того как эти списки получаются и что на выходе можно по разному реализовать. zip_longrst имеет параметр fillvalue, чем заполнять по умолчанию None. Ну и надо помнить про распаковку, то есть если все эти списки собраны ну например в какой то один список то можно использовать так.
    data = [x,y,z]
    list(zip_longest(*data))
    Ответ написан
    Комментировать
  • Как сделать так чтобы данные перезаписывались, а не добавлялись новые?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты используешь pandas датафрейм, потом начинаешь чего то изобретать. Pandas фрейм имеет метод to_sql https://pandas.pydata.org/docs/reference/api/panda.... Ему надо передать имя таблицы, объект соединения, так же у него есть параметр if_exists, которому можно присвоить значение replace. И будет перезапись.

    Раз уж у тебя есть фрейм то и оставайся в рамках датафрема сформируй необходимый подсет. И без cursor.execute отправляй в любую базу в том числе и в sqlite.
    Ответ написан
    8 комментариев
  • Как сделать так чтобы данные перезаписывались, а не добавлялись новые?

    Daemon23RUS
    @Daemon23RUS
    "INSERT INTO benz VALUES (?, ?, ?, ?, ?)"
    заменить на UPDATE ..... https://www.sqlite.org/lang_update.html
    P.S или использовать INSERT ..... ON CONFLICT(ключевое_поле) https://www.sqlite.org/lang_conflict.html
    Ответ написан
    Комментировать
  • Как формировать сырые SQL запросы максимально эффективно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я в самодельных билдерах запросов добавлял фейковый предикат 1=1 который всегда был. Тогда добавление новых предикатов делается проще. Вот как-то так.

    def get_user(*, username: str = None, email: str = None, id: int = None, is_blocked: bool = None):
        SQL = "SELECT * FROM USERS {} LIMIT %s OFFSET %s WHERE 1=1 "
        more = []
        if username:
            more.append("AND username = '%s'" % username)
        if email:
            if any([username]):
                more.append("AND email = '%s'" % email)
        if id:
            if any([username, email]):
                more.append("AND id = '%s'" % id)

    Я проверял этот код на валидность. Это лишь идея как сделать. Поэтому исправляй дальше сам.
    Ответ написан
    Комментировать
  • Где научиться профессионально искать и анализировать информацию?

    @dmshar
    Современное поколение почему-то твердо уверено, что любой ответ можно найти в интернет. В Гуугл или вот, последняя "панацея" - ChatGPT. Ну, на худой конец, вместо того, что-бы самому подумать, напрячься, поискать информацию, потом подумать, какая из них ложная или нет, потом опять подумать и обработать полученную информацию так, как нужно именно вам (а по дороге еще и хорошо потренировать свой мозг) - предпочитают пойти на форум, задать вопрос, лечь на диван посмотреть какой-нибудь фильмик (вариант - поиграть за компом в игруху) и дождаться, когда ответ преподнесут готовый, разжёванный, проверенный и подготовленный.
    Вот только в реальности все не так.
    1. Для того, что-бы задать вопрос - надо УЖЕ быть подготовленным, т.е. предварительно быть, что называется "в теме". Как минимум затем, что-бы правильные термины в запросе использовать, как максимум - задавать вопрос так, что бы он не был совсем дурацким.
    2. Для того, что-бы из полученной горы информационного шлака извлечь полезную информацию - надо УЖЕ быть подготовленным, т.е. предварительно иметь в теме достаточно знаний и опыта, что-бы понимать, где шлак а где золото.
    3. Для того, что-бы полученную информацию приспособить к своим конкретным потребностям - надо УЖЕ быть подготовленным, т.е. понимать свою тему настолько глубоко, что-бы можно было это препарирование сделать.
    Неучи подумали - появился ChatGPT - ура, сейчас на любой вопрос получим ответ и будет нам счастье, и учиться не надо! А вот фиг вам. На вопрос - "кто победил на прошлом чемпионате мира", или "как починить кран в умывальнике" - да ответ получите, и скорее всего правильный. А вот там, где надо думать, где вопросы не на фактаж, а на "подумать" - уже явно заметен парадокс: что-бы понять и извлечь пользу из диалога с ChatGPT надо быть умнее самого ChatGPT! Иначе будет не счастье, а горе. Т.е. надо сначала стать специалистом, а потом уже общаться с ИИ. Беда заключается еще и в том, что не понимая этого, надеясь на ИИ или даже на ЕИ (в виде коллективного разума на форуме) конкретный человек отучивается думать самостоятельно. Потому что жить на подсказках - это как жить на наркотиках. Мозг, привыкший к наркоте (подсказкам) перестает вообще развиваться и человек просто деградирует. И вот этом, а не в мифическом восстании ИИ против человечества - основная угроза, которую ИИ и несет человечеству.
    Так что ответ на ваши вопросы один - "учиться, учиться и еще раз учиться" - как говорил дедушка Ленин. Самостоятельно и серьезно. Т.е. сначала становимся специалистом хоть в чем-то, а потом думаем, как-же вооружиться инструментом УСИЛЕНИЯ наших знаний в виде Google, ChatGPT (или чего еще на тот момент придумают). А если нет базы - то усиляй не усиляй - все равно на выходе получишь пшик.
    Ответ написан
    Комментировать
  • Где научиться профессионально искать и анализировать информацию?

    vpetrov
    @vpetrov
    частный SEO-специалист
    Во-первых, стоит смотреть информацию по теме OSINT. Много бесплатной, есть и отдельные курсы. Ну, и инструментарий: https://www.exploit-db.com/google-hacking-database
    Во-вторых, не надо пользоваться поисковыми системами типа Гугл и Яндекс. Это, в общем, и не поисковые системы, а рекламные - уже давно. Попробуйте вот такое:
    https://biznar.com/biznar/desktop/en/search.html
    https://www.faganfinder.com/
    https://www.social-searcher.com/
    Как минимум, мультипоиск явно полезнее, чем привычные псевдо-ПС с их цензурой, рекламой и фильтрацией.
    Ответ написан
    Комментировать
  • Как получить доступ к свойству объекта JSON не зная его название?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как получить доступ к свойству объекта "extract" не зная его название?

    Итерированием объекта (если имеются вложенные объекты, то нужно обходить рекурсивно).

    Предположим, у нас имеется json объект, далее мы его итерируем и печатаем ключи и их значения (не зная названия ключей заранее):
    data = {
        "batchcomplete": "",
        "query": {
            "pages": {
                "18978754": {
                    "pageid": 18978754,
                    "ns": 0,
                    "title": "Apple",
                    "extract": "An apple is a round, edible fruit..."
                }
            }
        }
    }
    
    def print_key_value_pairs(obj, indent=0):
        if isinstance(obj, dict):
            for key, value in obj.items():
                print(' ' * indent + f"Key: {key}")
                if isinstance(value, (dict, list)):
                    print_key_value_pairs(value, indent+4)
                else:
                    print(' ' * (indent+4) + f"Value: {value}")
        elif isinstance(obj, list):
            for index, item in enumerate(obj):
                print(' ' * indent + f"Index: {index}")
                print_key_value_pairs(item, indent+4)
    
    print_key_value_pairs(data)
    Ответ написан
    7 комментариев
  • Правильно ли я понимаю устройство классов в python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Нет у тебя абсолютно не правильное представление по все пунктам. Написание хорошего ответа на каждый вопрос потребует дней, при том что на все эти темы можно разговаривать на совершенно разных уровнях. Если хоть как-то в двух словах.
    1. OOP одна из парадигм в программировании в том числе поддерживаемая python.

    2. Объект это python абстракция для данных, все данные в python представлены в виде объектов или взаимоотношений между объектами. Отсюда и выражение все в python является объектом.

    3. В python каждый класс не явно наследуется от object класс. Да даже если мы не переопределим явно __init__ то он там есть. Например
    class MyClass:
        pass
    my_instance = MyClass()
    print(dir(my_instance))
    Там будет в том числе __init__ хотя мы его явно не определяли. __init__ это конструктор класса там могут быть заданы атрибуты которые будут в области видимости экземпляра класса, с которыми будут оперировать методы экземпляра класса, он выполнится при создании экземпляра класса.

    4. По скольку, ты еще совсем новичок, понятия "приватных" и "защищенных" атрибутов обсуждать совсем бессмысленно, к тому же их "приватность" она в ковычках, в python нет способа создать настоящий приватный атрибут, но это все совершенно лишнее для тебя сейчас и в обозримом будущем.

    5. В зависимости от того является ли определенный метод методом класса или методом экземпляра класса, то первый позиционный параметр метода это класс или экземпляр класса. Между программистами python их принято называть cls - для класса, self - для экземпляра класса. Так как ты в начале пути будешь работать с методами экземпляра класса, да и необходимость создавать методы класса она значительно реже.

    Не думаю что тебе хоть что то стало понятней. По этому бери и изучай понимание будет приходить медленно и со временем, а не пытайся понять все вопросы на раз два.
    Ответ написан
    3 комментария
  • Как прокручивать страницу вверх Selenium Python?

    coderisimo
    @coderisimo
    Общая идея. Вам нужно крутить колесико (скролл) мыши через JS.
    Запихните в driver.execute_script что-то в этом роде :
    var evt = document.createEvent('MouseEvents');
    evt.initEvent('wheel', true, true); 
    evt.deltaY = -100000; 
    document.querySelector('.yamb-conversation__content').dispatchEvent(evt);

    вместо 10000 можно window.innerHeight.
    Ответ написан
  • Вопросы по sqlalchemy

    @NickolayDen
    Как сказал REDkiy, просто укажи:

    ```
    id = db.Column(db.Integer, primary_key=True)
    ```
    Ответ написан
    Комментировать
  • Вопросы по sqlalchemy

    @REDkiy
    Оживим труп. :-)
    SQLAlchemy требует обязательного(!) присутствия в таблице первичного ключа.
    Ответ написан
    Комментировать
  • Как запустить две асинхронные функции?

    @alekssamos
    Программист любитель
    import asyncio
    
    async def foo():
        print("foo")
    
    async def bar():
        print("bar")
    
    async def main():
        await asyncio.gather(foo(), bar())
    
    if __name__ == "__main__":
        asyncio.run(main())

    61d333cb317c8733090499.jpeg
    Ответ написан
    Комментировать
  • Как спарсить данные из PDF таблицы?

    Adamos
    @Adamos
    которое высылается каждый день в pdf файле в виде таблицы

    Кем? Рептилоидами, которые не идут на контакт и съедают всех почтовых голубей?
    Имхо, вы мужественно преодолеваете искусственно созданные проблемы.
    Причем, возможно, добьетесь кое-каких результатов... но первое же изменение "у них" эти ваши результаты похерит вдребезги напополам, и придется начинать все сначала.
    Запросите у источника данные в другом формате и не делайте себе голову.
    Ответ написан
    2 комментария