Задать вопрос
  • Как исправить ошибку "AttributeError: 'set' object has no attribute 'items'" в дискорд-боте?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В вашем коде несколько ошибок, одна из них - в качестве headers ожидается структура типа «словарь» («dict»), а вы создаете тип «множество» («set»).
    Должно быть что-то вроде:
    headers = {'user-agent': 'my-app/0.0.1', 'token': 'Токен есть если что'}

    и так далее, это прям из документации по requests

    Вторая ошибка - for lines in lines:
    очевидно надо что-то вроде
    for line in lines:
        …json = {"content": line}


    Исходя из всего этого видно, что хорошо бы разобраться со структурами вообще и в python со стандартными встроенными типами структур в частности, а также с итераторами и итерацией.
    Ответ написан
    1 комментарий
  • Что делает единичная звездочка в аргументах метода Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что делает единичная звездочка в аргументах метода Python?

    namedtuple(
    typename,
    field_names,
    *,
    rename=False,
    defaults=None,
    module=None,
    )

    Ни разу не встречал такое раньше, в документации тоже не смог откопать

    PEP 3102
    Ответ написан
    Комментировать
  • Какое значение должно быть у return, чтобы на выхлопе у функции были все числа из диапазона в строке?

    Нужно дописывать значения i в конец строки и возвращать уже строку.
    def join_numbers_from_range(start, finish):
        result = ""
        i = 1
        while i <= finish:
            result += str(i)
            i = i + 1
        return result
    print(join_numbers_from_range(start=5, finish=7))
    Ответ написан
    2 комментария
  • Как реализовать базовый класс для динамического создания подклассов без вызова рекурсии в Python?

    Vindicar
    @Vindicar
    RTFM!
    Пусть родительский класс имеет классовую переменную, храняющую список известных классов потомков и ассоциированные с ними данные.
    Потомки должны будут регистрировать себя в этой коллекции - либо явно (через метод или декоратор), либо неявно, через метакласс. Тогда родительский класс будет перебирать эту коллекцию в поисках "подходящего" класса-потомка и создавать его.

    Пример:
    class Parent:
        known_children = []  # список классов-потомков Parent
        @staticmethod
        def register(klass):  # декоратор для регистрации классов-потомков
            Parent.known_children.append(klass)
            return klass
        @classmethod
        def can_handle(cls, data):  # "эй, потомок, ты можешь себя создать из этих данных?"
            raise NotImplementedError()
        @staticmethod
        def make(data):  # создаёт экземпляр одного из потомков
            for child in Parent.known_children:
                if child.can_handle(data):  # потомок согласился обработать данные?
                    return child(data)  # вызываем конструктор класса-потомка 
            else:  # относится к for ... in !
                raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
        # тут остальная начинка класса
        ...
    
    # а это пример потомка
    @Parent.register  # явная регистрация потомка через декоратор
    # так удобнее, потому что так можно создавать промежуточных потомков,
    # которые не будут реально использоваться - только в наследовании
    class SomeChild(Parent):
        @classmethod
        def can_handle(cls, data):
            return data.get('name', None) == 'SomeChild'  # критерий для определения - наш случай или нет?
        
        def __init__(self, data):
            self.x = data['x']
            self.y = data['y']
    
    c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69})  # создаст экземпляр SomeChild
    print(c)
    try:
        Parent.make({'name': 'invalid'})  # потерпит неудачу
    except TypeError as err:
        print(err)
    Ответ написан
    Комментировать
  • При каких обстоятельствах запущен данный процесс python-программы?

    Vindicar
    @Vindicar
    RTFM!
    Я бы попробовал использовать аудит-хук.
    Многие функции питона генерят события аудита, на которые можно подписаться.
    Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
    Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
    import sys
    import traceback
    # хук который ловит событие импорта модуля
    def hook(event, args):
        if event != 'import':
            return
        name, filename = args[0], args[1]
        callstack = traceback.extract_stack(limit=None)
        print(event, name, filename)
        for item in traceback.format_list(callstack):
            print('    ', item.strip())
    
    sys.addaudithook(hook)
    
    import json
    
    print('Done')


    Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

    Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
    Ответ написан
    1 комментарий
  • Как вытащить из текста эмоджи?

    Maksim_64
    @Maksim_64
    Data Analyst
    В целом тебе нет необходимости для "удаления" вытаскивать в отдельную колонку. Обычно из фрейма ничего не удаляют, его не изменяют, а извлекают из него подсеты которые отвечают твоим требованиям. Код придется картинкой опубликовать а то форматирование не поддерживает эмоджи.
    6580990e822cb151482037.png

    Если ты не знаешь всех своих эмоджи то есть библиотеки получи все юникоды своих эмоджи и проверяй строку не содержит ли она юникод эмоджи, это будет очень медленно. лучше выбрать их несколько я думаю там их не много и как у меня в примере просто пусть их там десятка два будет а не два. Можно также попробовать простенькой регуляркой отловить что то типа такого
    df[df['comment_text'].str.contains(r'[^\w\s,]', regex=True)]
    Для моего примера работает, сработает ли в целом неизвестно.
    Ответ написан
    4 комментария
  • Как сделать индикатор подключенного устройства для линукса (XFCE)?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Напишите простенькое приложение на питоне и wxwidgets, которое отображает свое состояние в системном трее (taskbar) - https://wiki.wxpython.org/How%20to%20create%20a%20...
    Я таких приложений с десяток написпл, с менюшками и плюшками.
    Ответ написан
    2 комментария
  • Какая МЛ модель лучше подходит чтобы находить похожие названия (похожие не по смыслу)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Это называется стиль leet - https://ru.wikipedia.org/wiki/Leet
    Тут даже ML модель не нужна, алгоритм простой:
    1. Переводишь из leet в нормальный язык -> простая замена символов
    2. Нормализуешь
    3. Находишь расстояние хэмминга
    Ответ написан
    7 комментариев
  • Как FastAPI определяет, что запрос нужно обработать параллельно другим?

    Daemon23RUS
    @Daemon23RUS
    Note: You can mix def and async def in your path operation functions as much as you need and define each one using the best option for you. FastAPI will do the right thing with them.

    Anyway, in any of the cases above, FastAPI will still work asynchronously and be extremely fast.

    But by following the steps above, it will be able to do some performance optimizations.


    Обычный вызов выполняется асинхронно, но если вы указываете асинхронную обработку, то и асинхронность лежит на вас, а у вас там sleep во 2м примере который возвращает промис с задержкой.
    Ответ написан
    Комментировать
  • Чем подобрать пароль к архиву ARJ на линуксе?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    нет ничего лучше программ от Elcomsoft

    для ARJ- и ZIP-документов перебор ключей ведётся по содержимому, и, если сохранился исходник хотя бы одного документа, пароль будет найден в течение нескольких часов независимо от его длины и сложности;


    https://archpr.ru/
    Ответ написан
  • Есть ли боты для модерации?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    1 комментарий
  • Почему он выдает interrupt exception, который не ловится?

    Vindicar
    @Vindicar
    RTFM!
    Потому что вызов thread.start() который внутри start_listen() - не блокирующий. Главный поток продолжит работу, выйдет из try-except и завершится, так что на момент возникновения KeyboardInterrupt он уже будет завершён. Твой поток не помечен как daemon, поэтому интерпретатор продолжит работу (был бы помечен - программа бы завершилась тут же).
    Если ты делаешь join() - то пока запущенный поток не закончится, главный не продолжит работу.

    Собственно, в текущем виде тебе поток вообще не нужен, у тебя главный поток ничего не делает и так, и так.
    Что ты пытаешься сделать?
    Ответ написан
    Комментировать
  • Несколько пользователей или контейнеризация?

    @Drno
    lxd контейнеры
    ставится и настраивается в 2 клика, запускаете каждому свой контейнер и пусть там развлекается
    ну и ssh каждому прокинуть в нужный контейнер
    Ответ написан
    Комментировать
  • Я пишу музыкального бота для Discorda, но выводит ошибки. Не могу понять в чем именно проблема?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямым английским текстом написано: ты обращаешься к объекту, описывающему сервер(гильду), и пытаешься у него добыть свойство voice, а такого свойства нет.
    server.voice.channels - получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.
    И в документации свойства voice у объектов класса Guild тоже нет. Зато есть voice_channels.
    Ответ написан
    Комментировать
  • Вероятностные алгоритмы: какие бывают и где найти полный их список?

    begemot_sun
    @begemot_sun Автор вопроса
    Программист в душе.
    Здесь буду собирать ссылки на вероятностные алгоритмы:
    1. Фильтр блума https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D...
    2. MinHash habrahabr.ru/post/115147
    3. LogLog: находим число уникальных элементов -- habrahabr.ru/post/119852
    3.1 HyperLogLog
    4. Поиск похожих документов с MinHash + LHS: habrahabr.ru/post/250673
    5. https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch -- приближенный сбор частот событий в потоке.
    6. Алгоритм Рабина — Карпа: поиск подстрок в строке через хеширование. https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...

    https://en.wikipedia.org/wiki/Category:Probabilist...
    Ответ написан
    Комментировать
  • Как в питоне обеспечить контроль целосности данных?

    Vindicar
    @Vindicar
    RTFM!
    С переменными так не прокатит. А вот с полями класса - при желании можно, если использовать property.
    Базовая идея простая - пусть сеттер свойства производит валидацию.
    Например, так
    class Person:
        def __init__(self, name: str):
            self._name: str = ''
            self.name = name
        
        @property
        def name(self) -> str:
            return self._name
        
        @name.setter
        def name(self, value: str) -> None:
            if not value:
                raise ValueError('Must not be empty')
            self._name = value

    Но писать такой бойлерплейт быстро надоест. Поэтому можем попробовать обобщить процесс.
    Например, так
    from typing import TypeVar, Type, Any, Annotated, Callable, Dict, get_args, get_origin
    
    T = TypeVar('T')
    ValidationRule = Callable[[Any], bool]
    ValidationRules = Dict[str, ValidationRule]
    
    class ValidatedProperty:
        """Экземпляры этого класса будут свойствами в валидируемых классах, и будут заниматься валидацией."""
        def __init__(self, name: str, storagename: str, rules: ValidationRules):
            self.name = name  # как называется свойство
            self.storagename = storagename  # где его хранить
            self.rules = rules  # какие правила применять
    
        def __get__(self, instance, owner=None):
            return getattr(instance, self.storagename)  # при чтении просто возвращаем свойство
        
        def __set__(self, instance, value):  # при записи валидируем
            for message, rule in self.rules.items():  
                if not rule(value):  # если правило нарушено, выкидываем исключение с сообщением
                    raise ValueError(f'{instance.__class__.__name__}.{self.name}: {message}')
            setattr(instance, self.storagename, value)
    
    
    def validated(klass: Type[T]) -> Type[T]:
        """Декоратор для валидируемых классов."""
        for name, annot in klass.__annotations__.items():  # проверяем список аннотаций в классе
            base = get_origin(annot) or annot
            if base is not Annotated:  # нас интересуют только те, которые помечены как Annotated
                continue
            args = get_args(annot)
            rules = [arg for arg in args if isinstance(arg, dict)]
            if not rules:  # и только если один (любой) из аргументов Annotated - словарь
                continue
            # в этом случае мы считаем, что словарь содержит правила валидации, и создаём свойство класса
            setattr(klass, name, ValidatedProperty(name, f'_{name}', rules[0]))
        return klass  # не забываем вернуть изменённый класс!
    
    
    @validated
    class Person:
        name: Annotated[str, {'must not be empty': lambda v: bool(v)}]
        age: Annotated[int, {'must be positive': lambda v: v > 0}]
    
        def __init__(self, name: str, age: int):
            self.name = name  # валидация отработает уже здесь
            self.age = age  # валидация отработает уже здесь
        
        def __repr__(self) -> str:
            return f'Person(name={self.name!r}, age={self.age!r})'
    
    try:
        Person('John Doe', 23)  # отработает успешно
    except Exception as err:
        print('Failed to create person 1')
        print(f'{err.__class__.__name__}: {err!s}')
    else:
        print('Person 1 created')
    
    try:
        Person('', 23)  # выкинет исключение
    except Exception as err:
        print('Failed to create person 2')
        print(f'{err.__class__.__name__}: {err!s}')
    else:
        print('Person 2 created')
    
    try:
        Person('Jane Doe', -23)  # выкинет исключение
    except Exception as err:
        print('Failed to create person 3')
        print(f'{err.__class__.__name__}: {err!s}')
    else:
        print('Person 3 created')
    
    p = Person('John Doe', 23)
    try:
        p.name = ''  # выкинет исключение
    except Exception as err:
        print('Failed to modify person')
        print(f'{err.__class__.__name__}: {err!s}')
    
    try:
        p.age = 0  # выкинет исключение
    except Exception as err:
        print('Failed to modify person')
        print(f'{err.__class__.__name__}: {err!s}')
    
    try:
        p.age = 24  # отработает успешно
    except Exception as err:
        print('Failed to modify person')
        print(f'{err.__class__.__name__}: {err!s}')
    
    print(p)
    print(vars(p))


    Это, конечно, велосипед, и пользоваться им я бы не посоветовал. Для валидации есть библиотеки типа pydantic.
    Плюс, как было указано выше, не всё и не всегда имеет смысл валидировать...

    А для работы с БД лучше использовать ORM. SqlAlchemy популярна, но есть и более простые, например, peewee или ponyorm.
    Ответ написан
    Комментировать
  • Как в Python, используя logging, записать в traceback пойманного исключения значения локальных переменных функции?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй создать свой LoggerAdapter или Filter. Вообще в доках есть секция на эту тему, почитай, может, найдешь что полезное.
    По сути, схема работы logging такая:
    • Logger предоставляет интерфейс генерации логов приложению, и создаёт объект-запись.
    • LoggerAdapter вызывается логгером, чтобы дополнить запись специфичной для программы контекстной информацией.
    • Filter определяет, какие записи реально выводить в лог, и может их менять
    • Formatter делает из записи строку.
    • Handler записывает записи по назначению.


    Либо, если тебя устраивает вариант делать это вручную, ты можешь передать в параметр exc_info методов логгера кортеж вида (класс исключения, объект исключения, трейсбэк). Тогда ты можешь подставить свой трейсбэк вместо "родного".
    Ответ написан
    Комментировать
  • Как создать кнопки в ТГ боте Golang (telegram-bot-api)?

    RimMirK
    @RimMirK
    Вроде человек. Вроде учусь. Вроде пайтону
    кнопка под сообщением
    Инлайн кнопка, ее вставить в инлайн маркап. Инлайн маркап передать функции отправляющей сообщение.

    кнопа внизу
    Репли кнопку (кейборд батн) вставить в репли маркап. Маркап в функцию отправки.
    Ответ написан
    Комментировать
  • Какой гайд поможет делать авторизацию на сайте golang?

    DollyPapper
    @DollyPapper
    Во первых аутентификацию. Авторизация это про проверку прав.
    Если без REST API, то классика это принимать через POST запрос данные с формы.
    Вот статья
    Если кратко:
    Делаете ручку /signin, которая проверяет пароль присланный пользователем с хешем паролей в базе данных (ну или где вы храните данные)
    Если всё ок, создаете сессию, сохраняете сессию где нибудь в хранилище (опять же это может быть база данных, может быть ин мемори, есть библиотеки для этого, погуглите, да хоть в памяти приложения в мапе храните)
    Далее ID сессии записываете в куки и посылаете ответ пользователю в заголовком Set-Cookie sessid="session_id", где session_id это айди который вы раньше сгенерили.
    А далее пользователь ходит на ваш сайт, и какая нибудь мидлвара берет из запроса куки, берете оттуда id сессии, ищет этот айди в хранилище. Если нашла, то пропускает запрос дальше, если нет - 401 Unauthorized.
    Ну в статье вобщем всё подробно описано.
    Ответ написан
    Комментировать