• В чём смысл писать функциональные тесты на Java, если есть postman и другие инструменты?

    AnotherAnkor, Есть много историй с кафка или redis - где нам надо ходить и вариантов нет - и тут постман пролетает.
    Есть также всякие ui и скриншотные тесты, которые тоже надо писать и на постмане не сделать .
    А есть достаточно более сложные тесты где нам надо не только отправлять запросы, но слушать websoket, sse и не факт что только под одним пользователем.
    Плюс есть всякие штуки на создание и прочее, которые тоже простыми не бывают. И нам приходится использовать разные паттерны разработки.
    Да и много чего еще чего есть. Что если и можно сделать через постман - то это дорого и больно сложно.

    Но это не значит что постман плохой инструмент - это лиш значит, что он хорошо себя показывает в конкретных кейсах, на конкретных проектах.

    Если вы тестите простые веб-сервисы с простой логикой, то да отличный инструмент для автоматизации. И возможно что-то другое избыточно
    Ответ написан
    1 комментарий
  • Почему у меня время меняет свой формат?

    объект времени start_time = dt.time(9, 0) - всегда будет иметь секунды, и если ему всегда не задавать форматирование при печати, будет печатать с секундами.
    В своем формате в строку вы переводе только в двух случаях, вот они и как вы хотите и выглядит.

    То есть не надо путать строки и объект time
    Ответ написан
    Комментировать
  • Как исправить повторение одного и того же экземпляра в списке?

    Валерий Жмышенко
    первое что стоит сделать и проверить добавить @dataclass в базовую модель, что б генерировался метод init и атрибуты перестали быть общими
    и второе что скорее всего поможет это использовать field для создания экземпляров
    вместо
    vertex: ModelVertex = ModelVertex()

    писать как в документации

    vertex: ModelVertex = field(default_factory=ModelVertex)
    Ответ написан
    Комментировать
  • Как получать значение атрибута, обращаясь к экзмепляру класса?

    Первое стоит не забывать, что у вас storage - принадлежит классу а не отдельно экземплярам
    Ну и в целом если почитать про магические методы, то можно узнать очень много полезного и интересного
    from typing import List
    
    
    class Menu:
        storage: List = []
    
        def __str__(self):
            return str(self.storage)
    
        def __getattr__(self, item):
            if item not in self.storage.__dir__():
                raise AttributeError(f'Нет такого метода {item}')
    
            return getattr(self.storage, item)
    
        def append(self, item):
            self.storage.append(item)
    
    
    menu = Menu()
    
    menu.append(10)
    
    print(menu)
    
    menu.extend((11, 12,))
    
    print(menu)
    
    menu.not_method(10)
    Ответ написан
    Комментировать
  • Как правильно написать рекурсию в Python для сбора элементов по parent key?

    Если правильно понял то никакой рекурсии не надо.
    но если нужна какая доп группировка то да возможно потребуется

    from collections import defaultdict
    from pprint import pprint
     <spoiler title="values">
    d =[{'Ref_Key': '33ed0832-9697-11eb-8568-18c04d0357e4', 'DataVersion': 'AAABRgAAAAA=', 'DeletionMark': False,
          'Parent_Key': 'a888a6c7-bb96-11ea-834d-f0795994df35', 'IsFolder': True, 'Code': 'СГ-000359',
          'Description': '1.1. Затраты на приобретение прав на ЗУ ', 'ВидДеятельностиДляНалоговогоУчетаЗатрат': None,
          'ВидРасходовНУ': None, 'РеквизитДопУпорядочивания': '12', 'Код_Добавленный': '', 'Синтека_projectId': '',
          'Predefined': False, 'PredefinedDataName': '',
          'Parent@navigationLinkUrl': "Catalog_СтатьиЗатрат(guid'33ed0832-9697-11eb-8568-18c04d0357e4')/Parent"},
         {'Ref_Key': '33ed0834-9697-11eb-8568-18c04d0357e4', 'DataVersion': 'AAABSAAAAAA=', 'DeletionMark': False,
          'Parent_Key': 'a888a6c7-bb96-11ea-834d-f0795994df35', 'IsFolder': True, 'Code': 'СГ-000361',
          'Description': '1.5. Затраты на аренду ЗУ ', 'ВидДеятельностиДляНалоговогоУчетаЗатрат': None,
          'ВидРасходовНУ': None, 'РеквизитДопУпорядочивания': '13', 'Код_Добавленный': '', 'Синтека_projectId': '',
          'Predefined': False, 'PredefinedDataName': '',
          'Parent@navigationLinkUrl': "Catalog_СтатьиЗатрат(guid'33ed0834-9697-11eb-8568-18c04d0357e4')/Parent"},
         {'Ref_Key': '33ed0836-9697-11eb-8568-18c04d0357e4', 'DataVersion': 'AAABSgAAAAA=', 'DeletionMark': False,
          'Parent_Key': 'a888a6c7-bb96-11ea-834d-f0795994df35', 'IsFolder': True, 'Code': 'СГ-000363',
          'Description': '1.6. Затраты на изменение ВРИ.Проектирование', 'ВидДеятельностиДляНалоговогоУчетаЗатрат': None,
          'ВидРасходовНУ': None, 'РеквизитДопУпорядочивания': '14', 'Код_Добавленный': '', 'Синтека_projectId': '',
          'Predefined': False, 'PredefinedDataName': '',
          'Parent@navigationLinkUrl': "Catalog_СтатьиЗатрат(guid'33ed0836-9697-11eb-8568-18c04d0357e4')/Parent"},
         {'Ref_Key': '33ed0838-9697-11eb-8568-18c04d0357e4', 'DataVersion': 'AAABTAAAAAA=', 'DeletionMark': False,
          'Parent_Key': 'a888a6c7-bb96-11ea-834d-f0795994df35', 'IsFolder': True, 'Code': 'СГ-000365',
          'Description': '1.8. Прочие затраты на улучшения и содержание ЗУ',
          'ВидДеятельностиДляНалоговогоУчетаЗатрат': None, 'ВидРасходовНУ': None, 'РеквизитДопУпорядочивания': '15',
          'Код_Добавленный': '', 'Синтека_projectId': '', 'Predefined': False, 'PredefinedDataName': '',
          'Parent@navigationLinkUrl': "Catalog_СтатьиЗатрат(guid'33ed0838-9697-11eb-8568-18c04d0357e4')/Parent"}]</spoiler>
    
    tree = defaultdict(list)
    
    for value in d:
        tree[value['Parent_Key']].append(value)
    
    pprint(tree)
    Ответ написан
    Комментировать
  • Что быстрее и меньше занимает памяти: dict или Redis?

    Вы сравниваете теплое с мягким.
    Dict - это внутренняя структура данных которая хранится только в рамках запущенной программы. И по этой причине доступ к данным внутри него будет быстрее, при одинаковом хранении. И при перезапуске все данный потеряются.
    Redis - это внешнее хранилище данных, при перезапуске программы данные не потрутся, но так как это внешнее хранилище то и доступ к данным будет медленнее.
    Но они решают разные задачи, и служат для разных целей
    Ответ написан
    3 комментария
  • Как перевести список со списком внутри в строку?

    ну элементарно же, взять и и написать простенькую рекурсию
    from collections.abc import Iterable
    
    
    def iterator(obj):
        if isinstance(obj, Iterable):
            for v in obj:
                yield from iterator(v)
        else:
            yield obj
    
    
    b = [[78, 56, 232, 12, 11, 43], 11]
    a = list(iterator(b))
    print(a)
    
    [78, 56, 232, 12, 11, 43, 11]
    Ответ написан
    1 комментарий
  • Как перебрать два списка в Python?

    Да подумать дальше реально стоило, и почитать про встроенные функции базовые и прочее.
    Вот идея как можно не напрягаясь так сделать
    for keys in matrix_1:
        for key, values in zip(keys, matrix_2):
            print([(key, value, key*value) for value in values])
            
    [(2, 8, 16), (2, 9, 18)]
    [(3, 4, 12), (3, 5, 15)]
    [(4, 3, 12), (4, 6, 24)]
    [(5, 8, 40), (5, 9, 45)]
    [(6, 4, 24), (6, 5, 30)]
    [(7, 3, 21), (7, 6, 42)]
    Ответ написан
    1 комментарий
  • Как создать JSON из массива с повторением первого элемента?

    {"url"} - это не валидный json объект


    Стоит лучше и тщательнее читать учебник про циклы и объекты в питоне

    import json
    import collections
    videos = [[1,1,'url'],[1,2,'url'],[1,3,'url'],[2,1,'url'],[2,2,'url']]
    
    new = collections.defaultdict(dict)
    
    for season, series, url in videos:
        new[season][series] = url
    
    print(json.dumps(new, indent=4))
    
    {
        "1": {
            "1": "url",
            "2": "url",
            "3": "url"
        },
        "2": {
            "1": "url",
            "2": "url"
        }
    }
    Ответ написан
    Комментировать
  • Класс как контекст-менеджер. Методы 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)
    Ответ написан
    Комментировать
  • Стоит ли подписывать такой nda ???

    Стоит, если вы не будете продавать или пытаться продать кодовую базу - то к вам не кто не придет.
    Также если вы не будет сливать в сеть неопубликованные анонсы, то также никто не придет

    почему размыто, потому что сложно в реальности конкретизировать.
    И просто так с вас миллионы стрясти никто не будет, от этого мало профита.

    ну и нда подписывается в любой средне-крупной компании, и в большинстве маленьких, а вот историй про взыскания очень мало и сомневаюсь, что в них найдет хоть сколько-то значимый процент где "Рафик не виноват"
    Ответ написан
    Комментировать
  • Как узнать количество секций в 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 комментария