Ответы пользователя по тегу Python
  • Почему множество корректно при таком выражении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    B={3,4,5,6}
    B=B|{-1,-2,-3}

    Откуда тут взяться 1 и 2?
    Print -> Множество B: {3, 4, 5, 6, -2, -3, -1} Почему пропало 1,2,

    А вот в C они будут из A:
    A={1,2,3,4}
    B={3,4,5,6}
    C=A|B

    Просто будьте внимательнее
    Ответ написан
    1 комментарий
  • Почему JSON.loads выдает ошибку?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот вы делаете объект-парсер html:
    soup = BeautifulSoup(loging.content, 'html.parser')

    а вот суёте его вместо строки в парсер josn'а:
    json_dat = json.loads(soup)
    Вот вам об этом говорится в сообщении об ошибке:
    TypeError: the JSON object must be str, bytes or bytearray, not BeautifulSoup

    Вы пытаетесь засунуть в бензобак автомобиля целиком бензоколонку. Не лезет.
    Вам нужно найти способ извлечь из бензоколонки бензин и поместить его в бензобак.
    Ответ написан
  • Вопрос связанный с replace Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    stroka = input()
    new_stroka = stroka.replace("[b]", "<.b>")
    new_stroka = new_stroka.replace("[/b]", "<./b>")
    print(new_stroka)

    Строки в питоне неизменяемые. replace создаёт новую строку с замененными последовательностями. А вы результат первой замены затираете результатом второй.
    Ответ написан
    1 комментарий
  • Как при вызове метода в методе дочернего класса, передать объект материнского класса?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну и каша же у вас в... понимании. Вы сами поняли что написали-то?
    У вас наследование противоречит нарисованной диаграмме.
    class A()
    class B(A)
    class C(A)

    Что вы подразумеваете под передачей объекта в метод?
    Если методы не классовые, то вызывают их у объектов, а не у классов.
    Если вы пытаетесь вызвать метод класса С из объекта типа B, то у вас не получится, поскольку и B и С непосредственные потомки A.

    Опишите ваши классы кодом как есть, иначе по этому бессвязному изложению ничего не ясно.
    Ответ написан
    Комментировать
  • Установил python kivy. Почему не работает первая программа?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    pip install pillow
    Вот у вас красным по белому написано:
    5ecca2c591b8f005785541.png
    что нет модуля PIL в наличии. Скачайте дистрибутив в виде инсталлятора или вон как я выше показал поставьте его. Хотя у вас винда... ничего не гарантирую.
    Читайте внимсательно сообщения об ошибках. Обычно там всё есть. А на этом ресурсе принято прводить полный текст сообщения об ошибке в виде текста, а не в виде скриншота.
    Ответ написан
    Комментировать
  • Как исправить проблему с кодировкой (UnicodeEncodeError: 'latin-1' codec can't encode characters..) в тг боте?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    qr = pyqrcode.create(x.encode('utf-8'))
    И приводите в следующий раз, пожалуйста, полный текст ошибки. Там еже всё указано где проблема. Какого черта вы заставляете гадать на кофейной гуще?
    Думаете интерпретатор вам этот весь "мусор" просто так написал?
    Так и задали бы вопрос: написал программу - не работает, памагити!
    Ответ написан
    Комментировать
  • Как получить все комбинации элементов строки в срезе?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас произведение строки трижды на себя. Строка длиной 3. Итого 3**3 == 27 вариантов.
    Каждому элементу можно поставить в соответствие порядковый номер.
    for i in range(27): 
        print(f'{i:2}:', i // 9 % 3, i // 3 % 3, i % 3)

    Числа после двоеточий - это индексы в исходной строке.
    Вы можете теперь получить (вычислить) любой i-ый элемент вашей последовательности:
    s = 'abc'
    def g(i):
        return s[i // 9 % 3], s[i // 3 % 3], s[i % 3]
    
    for i in range(len(s) ** 3):
        print(g(i))

    Можно обобщить:
    def g(s, i):
        n = len(s)
        return [
            s[i // n**(n-j-1) % n]
            for j in range(n)
        ]
    
    my_custom_string = 'abc'
    for i in range(len(my_custom_string) ** len(my_custom_string)):
        print(g(my_custom_string, i))


    Ну и раз уж пошла такая пьянка, можно сделать ваше умножение индексируемым:
    import itertools
    import functools
    import operator
    
    
    class Producti: 
         def __init__(self, *iters, repeat=1): 
             iters = [list(it) for it in iters]
             self.iters = iters * repeat
             self._len = functools.reduce(operator.mul, map(len, self.iters)) 
    
         def __len__(self): 
             return self._len 
    
         #def __iter__(self): 
         #    return (self[i] for i in range(len(self))) 
    
         def __getitem__(self, idx): 
             if isinstance(idx, slice): 
                 return (self[i] for i in range(len(self))[idx])
             if idx >= len(self):
                 raise IndexError(f'product index out of range')
             r = [] 
             d = 1 
             for it in self.iters: 
                 r.append(it[idx // d % len(it)]) 
                 d *= len(it) 
             return tuple(r[::-1]) 
    
    
    for x in Producti('abc', repeat=3)[3:7]: 
         print(x)

    Единственное, чем нам приходится жертвовать по сравнению со штатным product'ом - это распаковкой элементных итераторов. Нам это нужно, чтобы заранее знать как приводить число к индексам.
    P.S.
    Кстати, метод "__iter__", в принципе, не нужен, iter(Producti('aa', '12')) проитерируется теперь и так (когда есть исключение по выходу за пределы len).
    Ответ написан
    Комментировать
  • Python: можно ли в модуль импортировать обычный текстовый файл json?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Импортировать нельзя.
    Загрузить и присвоить содержимое json-файла переменной внутри модуля можно.
    Вы объясните что вам надо, а вам расскажут как это делать правильно. Судя по вашему вопросу вам не поможет никакой ответ на него.
    Ответ написан
    Комментировать
  • Как однозначно переопределить сложение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Нужно, чтобы классы A, B, C, D были потомками одного абстрактного класса Base. Абстрактный класс должен декларировать общий для них интерфейс.
    2. Нужно сделать ещё один класс G - потомок от Base. G должен содержать внутри список элементов класса Base. Кроме этого G должен реализовывать все абстрактные методы своего интерфейса путём вызова соответствующих методов вложенных в свой список объектов.
    3. Класс Base должен перекрывать метод сложения __add__. Результатом сложения возвращается экземпляр G, содержащий список из складываемых элементов.
    Ответ написан
    Комментировать
  • Парсер на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Зачем парсер, когда у youtube есть API?
    Ответ написан
    Комментировать
  • Как добавить в архив по отдельному пути, но чтобы папка полная не писалась?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    with zipfile.ZipFile('spam.zip', 'w') as z: 
        z.write('C:\Windows\explorer.exe', 'path/in/archive/and_new_name.exe')
    Ответ написан
    1 комментарий
  • Как осуществить автоматическое обновление программы при ее запуске?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что конкретно вам не понятно?

    При запуске прога делает HTTPS GET-запрос по предварительно зашитому в ней урлу. Если из заголовков следует, что эта версия проге не нужна, то можно оборвать соединение и не получать сам файл обновления. Того же можно добиться и двумя запросами: первый HEAD, а второй, при необходимости, GET.
    Если скачана новая версия, нужно проверить её контрольную сумму и, очень желательно, подпись. Но если у вас https, то с подписью возиться не обязательно.
    Далее нужно запустить в отдельном процессе шелл-скрипт, который дождётся завершения старой проги и после этого запустит новую.
    На этом старая прога завершает свою работу.
    Как только скрипт увидит, что старая закрылась, сразу подменяет файл и запускает новую.
    Если что-то пошло не так, то можно записать сообщение о проблеме в файл и повторно запущенная старая прога, увидев это сообщение не будет пытаться обновиться снова на ту версию, поскольку "что-то пошло не так", а будет ждать новую.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если я вас правильно понял, то нужно по инициативе программы на питоне в одной машине инициировать запуск программы на питоне в другой машине.
    Много способов:
    • SSH позволяет удалённо что-то запустить, а питон может шелл-команду с запуском ssh с параметрами выполнить локально. Это приведёт к желаемому вам результату. Но нужно прописать ключи и подготовить всё это. Не безопасный вариант.
    • Вторая программа (а удаленной стороне) может поднять веб-сервер и ждать сигнал на запуск какого-то куска кода() в виде http-запроса. Этот вариант лучше первого.
    • Можно поднять на одной из перечисленных или на отдельной машине сервис с очередью сообщений, например RabbitMQ. Сигнал для запуска может быть передан через него.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам нужны афинные преобразования.
    Вот их можно нагуглить на стек-офверфлоу
    Ответ написан
  • Как остановить цикл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас такой длинный цикл. что надо кнопкой останавливать -- переделывайте. Такого в приложении быть не должно.
    Длительные операции нужно делать кусочками и асинхронно.
    Сформируйте очередь задач. Каждая задача должна быть мелкой и атомарной.
    У вас тут, судя по всему, сплошная архитектурная лапша в коде.
    Не ясно как вы этот код запускаете, не ясно что у вас вокруг него.
    Ясно только, что вы тут намудрили какой-то витиеватый костыль и пытаетесь решить стандартную задачу каким-то кустарным дендрофекальным методом.

    Из всего могу срезюмировать.
    • Выделите и изолируйте модель задачи.
    • Накапливайте их в очереди.
    • Заполняйте очередь когда это требуется. Вытаскивайте и обрабатывайте отдельные задачи когда это возможно, но асинхронно.

    Более подробно можно подумать, если объясните чего пытаетесь тут добиться.
    Если попробовать играть по вашим правилам и дать ответ на именно ваш не очень правильный вопрос, то нужно обрабатывать интерфейс в отдельном треде, между тредами поднять мьютекс и по его состояние проверять в этом цикле. Но это плохой путь.
    Ответ написан
    1 комментарий
  • Почему else - invalid syntax?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите, к какому, по-вашему, оператору if относится этот else. С учетом расставленных вами отступов ни к какому.
    Ответ написан
    1 комментарий
  • Парсинг данных Python и тэг br?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    name, _, age = list(soup.find_all(class_='block')[0].children)
    Ответ написан
    Комментировать
  • Как пере-импортировать переменную из файла Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    import importlib
    import config
    from config import templates, admins
    
    
    def reload():
        global templates, admins
        imprtlib.reload(config)
        from config import templates, admins

    Кстати, как в соседнем ответе верно подметили, плохая идея хранить конфигурацию в виде питоновского файла.
    Ответ написан
    Комментировать
  • Python как разделить текстовый файл на несколько по длине строки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    py "('x'*random.randint(1, 10) for _ in range(100))" | \ 
    py -x "open(f'tmp/path_to_dest_folder/words_len={len(x):05}.txt', 'a').write(x+'\n')"

    Первая строчка генерит слова, в вашем случае там будет cat big_file.txt.
    Вторая строчка разгребает все по файлам.
    Ответ написан
    Комментировать
  • Поможете с "cb = lambda m: random.choice(m.group(1).split('|'))"?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Передаётся вот здесь:
    rgx.sub(cb, s)
    Все сопоставления регекспу будут подаваться этой функции в аргумент.
    cb = lambda m: \     # Это лямбда-функция с одним аргументом по имени m
        random.choice(   # результат функции вычисляется методом случайного выбора из
            m.group(1)   # текста (сопоставленного с первой скобкой регекспа)
            .split('|')  #  разбитого по символу "|"
        )

    Регексп rgx = re.compile('\{([^{}]*)\}') находит куски текста в фигурных скобках и m.group(1) будет соответствовать этому куску при каждом вызове лямбды.
    Ответ написан