Ответы пользователя по тегу Python
  • Класс как контекст-менеджер. Методы enter и exit. Как решить задачу полностью?

    Надо не много поправить __exit__ первое проверку типа ошибки, и второе "подавление ошибки"

    class Example:
    
        def __init__(self):
            print('Вызов __init__')
    
        def __enter__(self) -> 'Example':
            print('Вызов __enter__')
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('Вызов __exit__')
            if exc_type is not None and issubclass(exc_type, Exception):
                print('Тип ошибки: ', exc_type)
                print('Значение ошибки: ', exc_val)
                print('"След" ошибки: ', exc_tb)
            return True
    
    
    my_obj = Example()
    
    with my_obj as obj:
        print('Код внутри первого вызова контекст менеджера')
        with my_obj as obj2:
            raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
        print('Я обязательно выведусь...')
    Ответ написан
    1 комментарий
  • Как перебрать числа если сократили дробь?

    судя по всему как и знаний питона
    from collections import defaultdict
    
    t = 0.01
    mass = [
        [34.224, 51],
        [34.226, 1],
        [34.227, 32],
        [34.234, 521],
        [34.236, 5],
        [34.247, 24],
        [34.248, 334],
        [34.274, 1],
        [34.274, 22],
        [34.290, 321],
        [34.292, 51],
        [34.299, 34]
    ]
    
    d = defaultdict(int)
    
    for key, value in mass:
        d[int(key / t)] += value
    
    print([[f'{k * t:.2f}', v] for k, v in d.items()])
    Ответ написан
    Комментировать
  • Как среди элементов списка найти такой, чётность которого уникальна?

    формируем списки где четные и не четные и берем, тот где длинна 1

    d = {0: [], 1: []}
    
    for v in [-9414011, 6617441, 9673581, 4326209, -2899849, 9923397, -2291281, -5434819, 8837901, 3041829, -1378743, 3743373, 3511523, 9455891, -1351663, 4948885, 5353785, 4909097, -4585903, -6153616]:
        d[v % 2].append(v)
        
    value = d[0][0] if len(d[0]) == 1 else d[1][0]
    Ответ написан
    Комментировать
  • Удаление из текста символов {color:#1f497d} Python?

    import re
    
    text = '''
    {color:#1f497d}Какой-то тест задачи{color}{color:#1f497d}MAC{color}{color:#1f497d}{color}{color:#1f497d}сервер
    текст.{color}
    '''
    
    rm_color = re.compile(r'\{color:#[A-Fa-f0-9]{6}}|\{color}')
    print(rm_color.sub(' ', text))
    Ответ написан
    Комментировать
  • Python декоратор, итератор, как зарегистрировать функцию?

    не много поправил ваш код
    class Caller:
    
        def __init__(self, *args, **kwargs):
            self.list_func = []
            self.args = args
            self.kwargs = kwargs
    
        def __iter__(self):
            for func in self.list_func:
                yield f'{func.__name__}: {func(*self.args, **self.kwargs)}'
    
        def app_func(self, func):
            self.list_func.append(func)
    
    
    def register_function(caller0):
        def my_decorator(func):
            caller0.app_func(func)
    
        return my_decorator
    
    
    caller1 = Caller(1, 2, z=5)  # создаем один объект Caller'а, который хранит в себе числовые аргументы
    
    
    @register_function(caller1)  # регистрируем функцию в обоих объектах
    def summator(x, y, z):  # сама функция просто возвращает сумму аргументов
        return x + y + z
    
    
    @register_function(caller1)  # регистрируем функцию в обоих объектах
    def func_2(x, y, z):  # сама функция просто возвращает сумму аргументов
        return x * y * z
    
    
    for result in caller1:  # теперь будем лениво вызывать функции, зарегистрированные
        print(result)
    
    
    summator: 8
    func_2: 10
    Ответ написан
    Комментировать
  • Как мне сделать, чтобы код скачал полную информацию из ссылок?

    async def get_url(url, session):
      file_name = str(uuid.uuid4())
      async with async_timeout.timeout(120):
        async with session.get(url) as response:
          with open(file_name, 'wb') as fd:
            async for data in response.content.iter_chunked(9000):
              fd.write(data)
              return 'Successfully downloaded ' + file_name - вот тут вы выходите из цикла и функции и скачиваете один только блок


    Вот так скачали завершили функциию 
                    async for data in response.content.iter_chunked(9000):
                        fd.write(data)
                        print(data)
                    return 'Successfully downloaded ' + file_name
    Ответ написан
    5 комментариев
  • Как сделать так, чтобы если в списке стоят 3 одинаковых числа под ряд то они удалялись?

    a = [1,2,3,3,3,4,5,6,6,6,6,6,3,3]
    
    from itertools import groupby    
    new_a= []
    
    for _, values in groupby(a):
        values = list(values)
        if len(values) < 3:
            new_a.extend(values)
            
    print(new_a)
    [1, 2, 4, 5, 3, 3]

    есть встроенная функция группировки, но можно посмотреть в её реализацию и сделать самому.
    Ответ написан
    2 комментария
  • Как сравнить два списка с частичным совпадением элементов?

    будет криво и не совсем корректно, но простого решения тут нет, надо брать и искать по семантическое сравнение

    import re
    
    files = ['новая папка', 'games', 'install', 'фото', 'музыка']
    search = ['папка', 'фотки', 'музло']
    
    finds = set()
    chars_find = re.compile(r'\w{3}')
    
    for file in files:
        for world_search in search:
            for world in chars_find.findall(world_search):
                if world in file:
                    finds.add(file)
    
    print(finds)
    Ответ написан
    Комментировать
  • Как узнать количество секций в config.ini заданных пользователем?

    Учим основы питона про словари и списки, учим циклы и используем

    import configparser
    from datetime import time
    from pprint import pprint
    
    config = configparser.ConfigParser()  # создаём объекта парсера
    config.read("conf.ini")  # читаем конфиг
    my_config_parser_dict = {s: dict(config.items(s)) for s in config.sections()}
    
    for block in my_config_parser_dict.values():
        block['bool'] = True
        block['time'] = time(15, 20)
        print(*block.values(), sep='|')
    
    print()
    pprint(my_config_parser_dict)


    вывод

    1|cam1|1-st floor|10.0.1.23|00:1A:C2:7B:00:47|True|15:20:00
    2|cam2|2-nd floor|10.0.1.24|00:4A:C2:7B:10:42|True|15:20:00
    3|cam3|3-rd floor|10.0.1.25|00:43:C2:7B:F0:13|True|15:20:00
    
    {'cam1': {'area': '1-st floor',
              'bool': True,
              'ip': '10.0.1.23',
              'mac': '00:1A:C2:7B:00:47',
              'name': 'cam1',
              'pos': '1',
              'time': datetime.time(15, 20)},
     'cam2': {'area': '2-nd floor',
              'bool': True,
              'ip': '10.0.1.24',
              'mac': '00:4A:C2:7B:10:42',
              'name': 'cam2',
              'pos': '2',
              'time': datetime.time(15, 20)},
     'cam3': {'area': '3-rd floor',
              'bool': True,
              'ip': '10.0.1.25',
              'mac': '00:43:C2:7B:F0:13',
              'name': 'cam3',
              'pos': '3',
              'time': datetime.time(15, 20)}}

    Ответ написан
    1 комментарий
  • Как исправить RuntimeWarning: coroutine was never awaited?

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

    print, request - синхронные в вашем коде нуль смысла асихронности
    перехватывать все исключения тоже не надо, может быть много побочек
    Ответ написан
    3 комментария
  • Как в Pytest создать паратремизованный тест с использованием разных параметров?

    у вас какая-то каша в коде:

    expected_response_text=[]
    for i in UA:
    expected_response_text.append(i)
    expected_response_text = {'user_agent': 'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30','platform': 'Mobile', 'browser': 'No', 'device': 'Android'}
    - вот тут вы идете по словарю, добавляете ключ в лист expected_response_text, потом в него же переприсваете словарь харкодный - что тут по вашему должно произойти?

    Ну и словари на прямую сравнивать бессмыслено надо всегда искать diff

    @pytest.mark.parametrize('agent, platform, browser, device', UA)
        def test_get_user_agent(self, agent, platform, browser, device):
            url = "https://playground.learnqa.ru/ajax/api/user_agent_check"
            UA = {"user-agent": agent}
    
            response = requests.get(url, headers=UA)
            parsed_response = response.json()
            expected_response_text = {
                'user_agent': agent,
                'platform': platform,
                'browser': browser,
                'device': device
            }
            print(expected_response_text)
            actual_response_text = parsed_response
            print(actual_response_text)
            assert not (result := compare(expected_response_text, actual_response_text)), result
    Ответ написан
    Комментировать
  • Логирование в разные файлы в Python3?

    Добавьте название для логгеров
    log_left = logging.getLogger('left')
    log_right = logging.getLogger('right')
    Если не передавать название, то будет приходить root - логгер, который один
    Ответ написан
    1 комментарий
  • Как работает данный код?

    легко и просто, в питоне есть как распаковка кортежей, что собственно и происходит
    получается примерно так:
    {}[()] = 0
    word = 'what

    также в питоне ключем в словаре может быть любой объект от которого можно взять hash, поэтому
    сначала {} - создается словарь, потом в этот созданный словарь с ключом () - кортеж идет присваивание данных

    но так писать не стоит
    Ответ написан
    Комментировать
  • FastAPI. Как добавить обработку данных в поле text, пришедшего в from pydantic import BaseModel?

    самым простым выглядит использование валидатора
    from pydantic import BaseModel, validator
    
    
    class Request(BaseModel):
        text: str
        client_id: str
    
        @validator('text')
        def str_to_lower(cls, text: str):
            return text.lower()
    
    
    print(Request(text='Lower To Lower', client_id='Client'))
    
    text='lower to lower' client_id='Client'
    Ответ написан
    Комментировать
  • Как можно оптимизировать код?

    Ну как минимум можно выкинуть не нужные функции типо проверок и расчетов, тут одна проверка и два варианта расчета, можно обойтись одной функцией, также можно добавить хранение промежуточных результатов, достаточно скоро, мы придем к тому что блоки последовательностей будут повторятся, и нет необходимости их пересчитывать, достаточно хранить и забирать известную о ставшую длину.
    import math
    from collections import defaultdict
    
    all_els = defaultdict(int)
    all_els[1] = 1
    max_length = 0
    
    
    def new_element(el: int):
        if not el % 2:
            return math.ceil(el / 2)
        return (3 * el) + 1
    
    
    def find_length(el: int):
        first_el = el
        length = 1
        while el != 1:
            el = new_element(el)
            if el in all_els:
                length += all_els[el]
                break
            length += 1
    
        all_els[first_el] = length
        return length
    
    
    for i in range(1, 10 ** 6):
        if max_length < (result := find_length(i)):
            max_length = result
    
    print(max_length)
    Ответ написан
  • Как сделать валидацию в использование Pydantic с заменой значения из словаря?

    с живым примером было бы проще, но так можно через @validator обрабатывать значения
    Пример реализации, само собой можно более сложную обработку делать
    from pydantic import BaseModel, validator
    
    keys = {
        '1': 'one'
    }
    
    
    class User(BaseModel):
        name: str = ''
        key: str = ''
    
        @validator('key')
        def update_key(cls, value):
            return keys.get(value, value)
    
    
    user_1 = User.parse_obj({'name': 'Test User', 'key': '1'})
    user_2 = User.parse_obj({'name': 'Test User', 'key': '2'})
    
    print(user_1)
    print(user_2)
    
    name='Test User' key='one'
    name='Test User' key='2'
    Ответ написан
    4 комментария
  • Кто поможет разобраться в классах Python?

    В питоне есть магические методы, которые позволяют, управлять сложение и прочими мат методами, и если использовать сложение то лучше пользовать ими
    from dataclasses import dataclass
    
    
    @dataclass
    class MoneyBox:
        sum: float = 0
        capacity: float = 100
    
        def can_add(self, v):
            v = getattr(v, 'sum', v)
            return (self.sum + v) > self.capacity
    
        def __iadd__(self, v):
            if self.can_add(v):
                raise ValueError('Больше нельзя')
    
            if isinstance(v, MoneyBox):
                self.sum += v.sum
            elif isinstance(v, (float, int)):
                self.sum += v
            else:
                raise TypeError(f'Не поддерживается тип {type(v)}')
    
            return self
    
    
    money_box = MoneyBox()
    money_box_any = MoneyBox(10)
    
    money_box += money_box_any
    
    print(money_box)
    
    money_box += 10
    
    print(money_box)
    
    money_box += '123'
    
    Traceback (most recent call last):
      File "C:/Users/User/PycharmProjects/test/tmp.py", line 1, in <module>
        from a import load
      File "C:\Users\User\PycharmProjects\test\a.py", line 34, in <module>
        money_box += '123'
      File "C:\Users\User\PycharmProjects\test\a.py", line 18, in __iadd__
        raise TypeError(f'Не поддерживается тип {type(v)}')
    TypeError: Не поддерживается тип <class 'str'>
    MoneyBox(capacity=0, sum=10)
    MoneyBox(capacity=0, sum=20)
    Ответ написан
  • Как вывести все имеющиеся ключи в json'е?

    Простое решение в лоб
    from random import randint
    from textwrap import wrap
    
    json_users = {randint(10000000, 9999999999): {
        "Warn": randint(1, 10), "Moderator": randint(10000000, 9999999999), "Reason": "1.3"}
        for _ in range(100)
    }
    
    warns = ''
    
    for user, data in json_users.items():
        moder, reason = data['Moderator'], data['Reason']
        warns += f'**Пользователь: {user}** \n**Модератор: {moder}** \n**Причина: {reason}**.\t'
    
    for chunk in wrap(warns, 400):
        print(chunk, '##new_line')
    Ответ написан
  • Как получить курс доллара?

    Раз, не более 5 запросов в секунду, 120 запросов в минуту с одного IP и не более 10000 запросов в сутки, пожалуйста. Если вам надо больше, то вы что-то делаете не так. Попробуйте использовать кеш данных курсов валют.
    from pprint import pprint
    
    import requests
    
    data = requests.get('https://www.cbr-xml-daily.ru/daily_json.js').json()
    pprint(data['Valute']['USD'])
    
    {'CharCode': 'USD',
     'ID': 'R01235',
     'Name': 'Доллар США',
     'Nominal': 1,
     'NumCode': '840',
     'Previous': 74.1373,
     'Value': 74.1567}
    Ответ написан
    2 комментария
  • Как правильно сделать подсказки для IDE?

    Модель правильнее держать вне функции, и создавать экземпляр класса
    ещё лучше посмотреть в pydantic или dataclass_json, так как если появятся сложные вложенные типы, то ручками их разбирать то еще удовольствие

    from dataclasses import dataclass
    
    
    @dataclass
    class Summoner:
        id: str = ''
        accountId: str = ''
        puuid: str = ''
        name: str = ''
        profileIconId: str = ''
        revisionDate: str = ''
        summonerLevel: str = ''
    
    
    async def SummonerByName(self, region, summonerName):
        response = await self.fetch(
            await self.summoner_v4.SummonerByName(
                region=region,
                summonerName=summonerName,
            )
        )
    
        return Summoner(**response)
    Ответ написан
    1 комментарий