Ответы пользователя по тегу Python
  • Как с помощью python прочитать свойство fill-opacity в тэге path?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    1. Заходим на сайт.
    2. Ищем html тег по css селектору.
    3. Достаем значение атрибута fill-opacity.
    4. Печатаем значение атрибута fill-opacity.
    import requests
    from bs4 import BeautifulSoup
    
    # go to website
    url = 'https://example.com'
    response = requests.get(url)
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        path_tag = soup.find('path', {'class': 'shape'})  # CSS selector
    
        if path_tag is not None:
            fill_opacity = path_tag.get('fill-opacity', 'Ошибка: fill-opacity не обнаружен!')
        else:
            fill_opacity = 'Ошибка: fill-opacity не обнаружен!'
    else:
        fill_opacity = f'Ошибка: не удалось подключиться к сайту {response.status_code}'
    
    # result
    print(fill_opacity)
    Ответ написан
    Комментировать
  • Возможно ли из класса-потомка получить класс-родитель?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Возможно ли из класса-потомка получить класс-родитель?

    Возможно, но все равно потребуется передавать атрибуты от потомка к родителю:
    from dataclasses import dataclass
    import typing
    import io
    
    # Определение базового класса для хранения информации о файле и ID объекта
    @dataclass
    class EjectedObjectDataFileNameAndObjectID:
        file_name: str  # Имя файла
        object_id: int  # ID объекта
    
    # Определение класса для хранения изображений
    @dataclass
    class EjectedObjectDataImages:
        images: typing.List[io.BytesIO]  # Список изображений в формате BytesIO
    
    # Класс, наследующий оба вышеуказанных класса и добавляющий дополнительные атрибуты
    @dataclass
    class EjectedObjectData(EjectedObjectDataImages, EjectedObjectDataFileNameAndObjectID):
        uuid: str  # Уникальный идентификатор
        position: typing.Tuple[int, int] = (0, 0)  # Позиция объекта (по умолчанию (0, 0))
        sorted: bool = False  # Флаг, указывающий, отсортирован ли объект (по умолчанию False)
    
        # Метод для создания экземпляра родительского класса из текущего экземпляра
        def to_parent(self) -> EjectedObjectDataFileNameAndObjectID:
            # Возвращаем новый экземпляр EjectedObjectDataFileNameAndObjectID,
            # используя атрибуты текущего экземпляра
            return EjectedObjectDataFileNameAndObjectID(self.file_name, self.object_id)
    
    
    # Пример использования:
    
    # Создаем экземпляр EjectedObjectData
    data = EjectedObjectData(["image1", "image2"], "some_file", 123, "some_uuid")
    
    # Получаем экземпляр родительского класса из экземпляра потомка
    parent_data = data.to_parent()
    
    # Выводим информацию о родительском классе
    print(parent_data)
    Ответ написан
  • Существует ли аналог Proxy и Reflect (как в JS) для Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Существует ли аналог Proxy и Reflect (как в JS) для Python?

    Встроенных аналогов нет, но можно реализовать самому.

    Аналог Proxy:
    class Proxy:
        def __init__(self, target):
            self.target = target
    
        def __getattr__(self, name):
            print(f"Пытаемся получить атрибут {name}")
            if isinstance(self.target, dict):
                return self.target.get(name, None)
            return getattr(self.target, name, None)
    
        def __setattr__(self, name, value):
            if name == 'target':
                super().__setattr__(name, value)
            else:
                print(f"Устанавливаем значение {value} для атрибута {name}")
                if isinstance(self.target, dict):
                    self.target[name] = value
                else:
                    setattr(self.target, name, value)
    
    obj = Proxy({'x': 1})
    print(obj.x)
    obj.x = 2

    Как функция:
    class Proxy:
        def __call__(self, *args, **kwargs):
            print("Объект вызван как функция")
    
    p = Proxy()
    p()

    Аналог Reflect:
    obj = {'x': 1}
    print(getattr(obj, 'x', None))
    setattr(obj, 'x', 2)

    Управлять классами в момент создания:
    class Meta(type):
        def __new__(cls, name, bases, dct):
            print(f"Создается класс {name}")
            return super().__new__(cls, name, bases, dct)
    
    class MyClass(metaclass=Meta):
        pass
    Ответ написан
  • TypeError: 'NoneType' object is not callable?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    massage_handler - массаж обработчика?

    Табуляция для await message.answer вышла из чата?
    @dp.massage_handler()
    async def echo(message: types.Message):
    await message.answer(message.text)

    Попробуйте так:
    from aiogram import Bot, Dispatcher, executor, types
    
    # Bot init
    bot = Bot(token="6563641220:AAFBWH_TQ4SW_Zk-6sVyBpeX5rSJitWoRQM")
    dp = Dispatcher(bot)
    
    # echo
    @dp.message_handler()
    async def echo(message: types.Message):
        await message.answer(message.text)
    
    # Запуск лонг-полинг
    if __name__ == "__main__":
        executor.start_polling(dp, skip_updates=True)
    Ответ написан
    Комментировать
  • Почему я получаю разные значения из bytes при итерации и при высчитывании шестнадцатеричного числа вручную?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вероятно, Вы не учли символы > и _, которые также являются частью Вашей строки bytes. Коды этих символов (62 и 95) в десятичной системе и являются теми числами, которые вызывали у Вас вопросы.

    data = b'>\x02\xfe\xbf_\xec\xe6\xee\x00R'
    
    for i in range(len(data)):
        hex_repr = '\\x{:02x}'.format(data[i])
        print(i, data[i], f"({hex_repr})")
    
    # 0 62 (\x3e)
    # 1 2 (\x02)
    # 2 254 (\xfe)
    # 3 191 (\xbf)
    # 4 95 (\x5f)
    # 5 236 (\xec)
    # 6 230 (\xe6)
    # 7 238 (\xee)
    # 8 0 (\x00)
    # 9 82 (\x52)
    Ответ написан
    1 комментарий
  • Как выбрать значение в дропдаун меню используя selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Got error selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated

    Как можно поправить? На экране он виден

    Для парсера он не виден, по разным причинам.

    Попробуйте так:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("example.com")
    
    # находим и кликаем на элемент .SumoSelect
    dropdown_container = driver.find_element(By.CSS_SELECTOR, ".SumoSelect")
    dropdown_container.click()
    
    # ждем появления элемента li.opt label, но не более 10 сек
    option_to_select = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "li.opt label"))
    )
    
    # итерируемся по всем option и кликаем, если текст option равен AB
    for option in options:
        if "AB" == option.text.strip():
            option.click()
            break
    else:
        print("Не удалось найти нужную опцию.")
    
    driver.quit()
    Ответ написан
    1 комментарий
  • Почему код разбиения на слагаемые не работает?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему когда я указываю большие разбиваемого и количества слогаемых,вылетает ошибка:
    print(partition(1024,5))

    Превышено количество рекурсивных вызовов в Python.

    Можно увеличить глубину рекурсий:
    import sys
    sys.setrecursionlimit(5000)

    Либо, переписать функцию в итеративном стиле:
    def partition(n, k):
        stack = [(n, k, [])]
        while stack:
            current_n, current_k, current_partition = stack.pop()
            
            if current_n == 0 and current_k == 0:
                print(" + ".join(map(str, current_partition)))
            elif current_n == 0 or current_k == 0:
                continue
            elif current_n < 0:
                continue
            else:
                for i in range(1, current_n+1):
                    new_n = current_n - i
                    new_k = current_k - 1
                    new_partition = current_partition + [i]
                    stack.append((new_n, new_k, new_partition))
    
    partition(5, 3)
    Ответ написан
    1 комментарий
  • Как добавить программу в автозагрузки в regedit на python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как создать ярлык программы с «тихим» запуском?
    Там есть пример добавления в автозагрузку. Вам потребуется создать отдельный скрипт, который добавит Ваш основной скрипт в автозагрузку.

    UPD, Добавление программы в автозагрузки в regedit на python:
    import winreg
    
    # Добавляем в автозагрузку
    def add_to_startup(program_name, executable_path):
        # Реестр
        registry_path = winreg.HKEY_CURRENT_USER
        key_path = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
        
        try:
            # Открываем ключ реестра для записи
            with winreg.OpenKeyEx(registry_path, key_path, 0, winreg.KEY_WRITE) as registry_key:
                # Создание или обновление реестра
                winreg.SetValueEx(registry_key, program_name, 0, winreg.REG_SZ, executable_path)
            print(f"{program_name} добавлена в автозагрузку.")
            
        except PermissionError:
            print("Нужны админские права.")
            
    # Проверка программы в автозагрузке
    def check_startup_entry(program_name):
        registry_path = winreg.HKEY_CURRENT_USER
        key_path = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
        
        try:
            # Открываем ключ реестра для чтения
            with winreg.OpenKeyEx(registry_path, key_path, 0, winreg.KEY_READ) as registry_key:
                program_path, regtype = winreg.QueryValueEx(registry_key, program_name)
            print(f"{program_name} уже добавлена в автозагрузку с путем: {program_path}")
            
        except FileNotFoundError:
            print(f"{program_name} не найдена в автозагрузке.")
    
    if __name__ == "__main__":
        program_name = "GodzillaSoft"
        program_path = r"C:\path\GodzillaSoft.exe"
        
        check_startup_entry(program_name)
        add_to_startup(program_name, program_path)

    Важно! Добавление программы в автозагрузку без явного согласия пользователя может считаться вредоносным действием. А так же, осторожнее с реестром, можно одним запуском скрипта наломать много дров...
    Ответ написан
    3 комментария
  • Что означает выражение. {x:1} в f.строках python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Это "f-строки"/"форматированные строковые литералы", простой пример:
    x = 5
    y = 555
    print(f"{x:1}")  # "5", минимальная ширина поля вывода переменной x = 1 (вывести значение x, удостоверившись, что оно занимает по меньшей мере один символ)
    print(f"{x:3}")  # "  5"
    print(f"{y:3}")  # "555"
    
    # Округление Pi до десятичного значения
    pi = 3.141592653589793
    print(f"Pi: {pi:.1f}")  # Pi: 3.1
    Ответ написан
    Комментировать
  • Как скрыть код на питоне на мини-компьютере от пользвователя?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Решение, которое позволит поднять стоимость реверса Вашего приложения до неприличного значения:
    1. Обфусцируем код через https://github.com/dashingsoft/pyarmor .
    2. Перегоняем п1. через https://github.com/Nuitka/Nuitka в сишный код.
    3. Компилим п2. в машинный код.
    4. Запускаем п3. exe-шник на клиенте.

    Получаем:
    1. Увеличение производительности.
    2. Exe-шник из машинного кода.
    Ответ написан
    3 комментария
  • Как создать ярлык программы с "тихим" запуском?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Если правильно понял задачу:
    1. Создаем ярлык указанного приложения.
    2. Запуск указанного приложения без окна консоли.
    3. Запущенное приложение не будет светиться в трее.
    4. Приложение будет добавлено в автозагрузку.
    5. Винда.

    1. Используем vbs скрипт для тихого запуска, silent.vbs:
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run chr(34) & "C:\machine\mynote.exe" & Chr(34), 0
    Set WshShell = Nothing

    2. Запуск и добавление в автозагрузку через Python:
    import os
    import winshell
    
    def create_autostart_link_for_vbs(application_path, link_name, start_directory="", icon_directory=None):
        # Путь к папке автозагрузки
        startup_folder = winshell.startup()
        
        # Путь, где будет храниться ярлык
        link_path = os.path.join(startup_folder, f"{link_name}.lnk")
        
        # Создание ярлыка
        with winshell.shortcut(link_path) as link:
            link.path = application_path
            link.description = f"Link for {application_path}"
            link.working_directory = start_directory
            if icon_directory:
                link.icon_location = (icon_directory, 0)
    
        return link_path
    
    # Путь до vbs скрипта
    path_to_vbs = r"C:\machine\silent.vbs"
    
    # Юзаем
    create_autostart_link_for_vbs(path_to_vbs, "AutostartAppWithoutWindow")

    Важно! Приложение может по разному реагировать на то, если его запускают в тихом режиме.
    Ответ написан
    3 комментария
  • Как получить доступ к свойству объекта 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 комментариев
  • Как объединить результаты всех процессов Pool?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Используйте outcomes после выполнения Pool, попробуйте так:
    from itertools import repeat
    from multiprocessing import Pool, Manager
    
    def reader(entry, outcomes):
        # ...
        
        prediction = min(distances) + (mlc_data[min(distances)[1]],)
        outcomes[entry_pairs[' '.join(entry)]] = prediction
    
    manager = Manager()
    outcomes = manager.dict()
    
    with Pool(3) as p:
        # Обрабатываем каждый элемент из input[0] и сохраняем результаты в outcomes:
        p.starmap(reader, zip(input[0], repeat(outcomes)))
        p.close()
        p.join()
    
    print(outcomes)  # должен содержать все элементы
    Ответ написан
    4 комментария
  • Как правильно выполнить подключение sqlalchemy к postgresql?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Обратите внимание на свой пароль, попробуйте так:
    adssa%40123

    По идее, для SQLAlchemy Ваш пароль adssa@123 будет означать login@host.
    Ответ написан
    2 комментария
  • Как вернуть значение из функции?

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

    Я не хочу делать два альтернативных выхода

    Если я правильно понял задачу, то:
    1. Объявляем все возвращаемые данные заранее (те 3 переменные) с дефолтным значением, напр: var1, var2, var3: '', '', ''
    2. Изменяем данные из п1. по необходимости в процессе выполнения функции.
    3. Возвращаем данные из п1 в виде словаря: {'data1': var1, 'data2': var2, 'data3': var3}
    Ответ написан
    Комментировать
  • Как автоматизировать запись в sqlite на Python, регулируя количество перезаписываемых переменных?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    import sqlite3
    
    def update_db(**params):
        # Если 'idd' нет в параметрах
        if 'idd' not in params:
            raise ValueError("Ты забыл передать 'idd'! Это обязательно.")
    
        # Достаем 'idd' из параметров
        user_id = params.pop('idd')
    
        # Создаем строку для SQL запроса
        set_clause = ', '.join(f"{key} = ?" for key in params.keys())
        query = f"UPDATE users SET {set_clause} WHERE gi = ?"
    
        # Подготавливаем значения для SQL запроса
        values = list(params.values()) + [user_id]
    
        # Подключаемся к БД
        with sqlite3.connect('baza.sql') as conn:
            cur = conn.cursor()
            cur.execute(query, values)
            conn.commit()
    
    update_db(name="Антон", date="05 марта", ank="Ой всё!", idd="id99938")
    update_db(name="Сергей", idd="id99939")
    Ответ написан
    2 комментария
  • Ошибки при парсинге в python как избежать?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Может обрабатывать исключения?
    def extract_value_from_input(element, index):
        try:
            return element.find_all('input')[index]['value']
            # or @Maksim_64
            return element.find_all('input')[index].get('value','')
        except (IndexError, KeyError):
            return ''
    
    uq = {}
    uq["val"] = extract_value_from_input(g[3], 1)
    Ответ написан
  • Как вывести строку из csv файла без лишних символов на python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    import csv
    
    def get_search_terms():
        return input("Вводи данные пёс, и разделить не забудь ';': ").split(';')
    
    def find_matches_in_csv(file_name, search_terms):
        found_entries = []
    
        with open(file_name, 'r', encoding='utf-8') as csv_file:
            reader = csv.reader(csv_file, delimiter=';')
            
            next(reader)
            
            for row in reader:
                if any(term.lower() in entry.lower() for entry in row for term in search_terms):
                    formatted_row = '; '.join([x for x in row if x])
                    found_entries.append(formatted_row)
        
        return found_entries
    
    if __name__ == "__main__":
        FILE_PATH = 'krasna.csv'
        terms_to_search = get_search_terms()
        
        matching_entries = find_matches_in_csv(FILE_PATH, terms_to_search)
        
        if matching_entries:
            for entry in matching_entries:
                print(entry)
        else:
            print("Не найдено")

    Результат:
    978196782; Віталій; Даниленко; Андрійович
    Ответ написан
    1 комментарий
  • Можете посоветовать книги или курсы по python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Примерно нахожусь между начинающим и средним

    Вот темы которые я знаю на достаточном уровне:
    - Основы python (циклы, условные операторы, переменные, функции, строки, списки)
    - Вложенные списки (матрицы)
    - Кортежи
    - Множества
    - Словари
    - Некоторые модули

    Это даже не джун, о каком среднем Вы говорите?

    Можете посоветовать книги или курсы по python?

    1. Гуглите "учебник python" и решаете все от А до Я.
    2. Гуглите следующий учебник, который восполнит пробелы п1.
    3. Ищите себе пет-проект и пытаетесь его реализовать (повторить несколько раз). Т.к. Python сильно разносторонне-развитый язык, то и проекты должны быть в портфолио такие, которые от Вас может ожидать работодатель/заказчик.
    4. Ищите людей, которые сделают ревью п.3.
    5. Заливаете достойные проекты на гит.
    6. Идете на собесы, попутно устраняя пробелы в знаниях и пет-проектах, которые услышите на собесах.
    Ответ написан
  • Есть ли способ аннотировать аргументы метода переменной класса?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    На данный момент в Python нет прямого способа аннотировать типы аргументов, которые зависят от внутреннего состояния объекта или определяются во время исполнения программы.

    Как вариант, можно закостылить так:
    from dataclasses import dataclass
    from typing import Any, Literal, TypeAlias, Self 
    
    @dataclass()
    class BaseConfig:
        ITEM: TypeAlias = Literal["item1", "item2"]
    
    class MyClass:
        def __init__(self, config: BaseConfig = BaseConfig) -> None:
            self.config = config
    
        def meth(self, item: Any) -> Self:
            if item not in self.config.ITEM:
                raise ValueError(f"Invalid value {item} for item. Expected one of {self.config.ITEM}.")
            ...
    Ответ написан
    Комментировать