Ответы пользователя по тегу Python
  • Как в Python 3 вызвать функцию чьё название написано в строке?

    @bbkmzzzz
    Создайте словарь. Ключ - строка для определения, значение - функция.
    def foo():
        print('foo()')
    
    def bar(x):
        print(x)
    
    dc = {'foo': foo, 'bar': bar}
    dc['foo']()
    dc['bar'](10)
    Ответ написан
    Комментировать
  • Как передать переменную из одной функции в другую?

    @bbkmzzzz
    так, а в чем вопрос?
    self.entryFileName определена как атрибут объекта. Разве что ее не существует, пока не вызван метод init_twoWind(self)
    если попытаетесь вызвать def makeFile(self) ДО вызова init_twoWind(self) - получите ошибку NameError.
    Все атрибуты объекта лучше инициализировать в __init__, он для того и нужен.

    Почитайте про классы поподробнее, можно тут.
    Для передачи чего-либо в функцию/метод нужно определить аргументы, которые принимает такая функция/метод.
    def foo(x):  #  функция ждет один аргумент, который внутри функции будет под именем x
        print(x)
    foo(10)
    foo() #  TypeError: foo() missing 1 required positional argument: 'x'
    Ответ написан
  • Можно ли использовать глобальные переменные в классе?

    @bbkmzzzz
    Никогда не используйте глобальные переменные)
    Вы можете создать эталонный класс со всеми нужными переменными и наследоваться от него.
    class Foo:
        def __init__(self):
            self.a = 1
            self.b = 2
    
        def f(self):
            return self.a + self.b
    
    
    class Bar(Foo):
        def __init__(self):
            super().__init__()
    
    
    x = Bar()
    print(x.a)
    x.a = 50
    print(x.f())
    Ответ написан
    Комментировать
  • Как текст из QLineEdit добавить в QListWidget по нажатию кнопки?

    @bbkmzzzz
    вы не сохранили ни одной ссылки на виджеты. Созданные элементы лучше где-то хранить, дабы иметь к ним доступ.

    А добавление через метод addItem
    QListWidget.addItem

    self.button1 = QPushButton('text') #  класс родителя можно не передавать, Qt сделает все сам
    self.ql = QListWidget()
    self.ql.addItem(QListItem('text'))
    Ответ написан
    Комментировать
  • Как построить цикл в python, без ошибки?

    @bbkmzzzz
    IndentationError: expected an indented block <- ошибка отступов. Питон чувствителен к регистру и отступам. В блоках нужно делать отступ, по умолчанию 4 пробела. Не стоит использовать табуляции:
    x = 5
    if x == 10:
        print('x == 10')
    elif x == 3:
        print('x == 3')
    else:
        print('x что-то странное')
    Ответ написан
    Комментировать
  • Как получить переменную data после исполнения асинхронной функции?

    @bbkmzzzz
    При асинхронном подходе логика программы другая. Вот тут неплохо почитать.
    И не используйте глобальные переменные.
    Ответ написан
    Комментировать
  • Как сделать это на python?

    @bbkmzzzz
    Если запросы однотипные и не сильно сложные - библиотека TCP. Предоставляет сырые сокеты. Слушаем порт, парсим данные и далее по списку. Ну или полноценные http фреймворки, а ля django или flask
    Для json библиотека json =)
    Ответ написан
  • Как сделать кнопку Stop активной в приложении PyQT5?

    @bbkmzzzz
    self.start_btn.clicked.connect(self.scrape)
    self.start_btn.clicked.connect(self.stop)
    одно событие - 2 реакции.

    Активность/не активность виджетов задается методом setEnabled(bool).
    Не активные элемент сигналы не посылают
    Ответ написан
    8 комментариев
  • Почему появляется сбой разметки и как исправить?

    @bbkmzzzz
    Вам нужно разрешить изменение размеров элементов внутри scrollArea
    self.TAGS_WIDGET['scroll_area'].setWidgetResizable(True)

    Тогда тоже поплывет, но настраивать нужно будет уже сами компоновщики

    UPD
    Уберите выравнивания у self.TAGS_WIDGET[descrip], он перемещает виджет к краю ячейки компоновщика и использует минимальные размеры виджета
    Ответ написан
    Комментировать
  • Задача на Python?

    @bbkmzzzz
    3 варианта у существительных после числительных.
    Правила простые:
    оканчивается на 1, но не на 11
    оканчивается на 2 3 4, И НЕ в диапазоне 10-20(включительно)
    все остальные

    формы слов отвечают числам 1,2,5

    например:
    1 ворона
    2 вороны
    5 ворон

    берем остаток от деления нужного число на 10 и на 100 и пробегаем по условиям.
    так можно любые числа проверять, а не до 1000, включая отрицательные

    words = ['ворона', 'вороны', 'ворон']
    
    def plural(num, words):
        if num == 0:
            return words[2]
        d10 = num % 10
        d100 = num % 100
        if d10 == 1 and d100 != 11:
            return words[0]
        elif (2 <= d10 <= 4) and (d100 < 10 or d100 > 20):
            return words[1]
        else:
            return words[2]
    num = 21
    print(num, plural(num, words))
    Ответ написан
    Комментировать
  • Можно ли вывести переменную полученную в функции?

    @bbkmzzzz
    def foo():
        result = 2 + 2
        return result
    print(foo())

    если return нет в функции, то возвращается None
    Ответ написан
    Комментировать
  • Как узнать из-за чего упало приложение с PyQt5?

    @bbkmzzzz
    можно попытаться через модуль traceback.
    from traceback import format_exc
    from sys import stderr
    
    ## момент на котором предположительно может падать
    
    try:
        ...
    except:
        print(format_exc(10), file=stderr) # 10 - глубина стека ошибки
    Ответ написан
    Комментировать
  • Как сделать "кликабельные" карточки?

    @bbkmzzzz
    QListView генерирует событие clicked с индексом элемента модели, подписывайтесь на сигнал и обрабатывайте.
    Ответ написан
  • Как правильно обработать исключение?

    @bbkmzzzz
    try:
        es = Elasticsearch(elastic_servers, http_auth=(elastic_user, elastic_password))
        res = es.search(index=indices, body=quer
    except Exception as exc:
        print('ALARM!', exc.args)


    если нужен стек исключения - модуль traceback поможет
    from traceback import format_exc
    ...
    try:
        es = Elasticsearch(elastic_servers, http_auth=(elastic_user, elastic_password))
        res = es.search(index=indices, body=quer
    except:
        print('ALARM!')
        print(format_exc(10)) # 10 - глубина стека
    Ответ написан
    Комментировать
  • Можно ли в клиент-серверном приложении на клиенте подключиться к другому клиенту?

    @bbkmzzzz
    Клиент - часть клиент-серверного приложения, которое по умолчанию только подключается.
    Сервер - только принимает подключения.
    Что бы клиент мог принимать подключения, он должен быть еще и сервером. Таким образом он перестает быть чисто клиентом и становится гибридом.

    Схема примерно такая:
    клиент подключается к серверу
    сервер передает информацию о других клиентах и закрывает соединение, ведь он больше не нужен.
    клиент подключается к другим клиентам, используя информацию от сервера.

    архитектурные вопросы)
    Ко всем сразу, кстати?
    А если клиентов в сети 1000?
    на каждом компьютере по 1000 активных подключений для одной программы?
    Или клиент подключается по мере необходимости?
    Тогда как быть с уже закрытым клиентом на той стороне?

    Лучше для общей коммуникации использовать сервер, а соединение клиент-клиент использовать для передачи больших объемов данных, например файлов.
    Ответ написан
    Комментировать
  • Python: сокеты на dynamic dns, как реализовать?

    @bbkmzzzz
    sock.bind((socket.gethostbyname("***********.ddns.net"),0)) #host указан верно

    На Вашем компьютере существует сетевой интерфейс (грубо говоря - сетевая карта) с адресом, который резолвится из ***********.ddns.net? Вы будете принимать входящие соединения? Ведь вы привязываете сокет на доступность с определенного интерфейса для входящих(!) подключений. Если не указывать интерфейс - сокет будет доступен на всех сетевых интерфейсах компьютера.

    Нулевой порт использовать можно только если Вы четко знаете что делаете. Все порты до 1024 требуют прав администратора для привязки сокета.

    Для корректной работы нужно два условия:
    1: Вы привязываете сокет на существующий интерфейс сетевой карты, или на все, если использовать "socket.bind(('', port))
    2: порт, который Вы пытаетесь привязать к сокету никто еще не использует.

    Для подключения куда-либо bind использовать не нужно, bind только для прослушивания.
    порт для подключения через connect - обязателен.

    import socket
    sock = socket.socket()
    HOST = socket.gethostbyname("***********.ddns.net")
    PORT = 80
    sock.connect((HOST, PORT)) #host указан верно PORT - обязательно
    # sock.listen(1) - только для прослушивания
    # con,addr = sock.accept() только для прослушивания
    #while True:  не имеет смысла, нет корректного выхода из цикла.
    sock.send(b"HI")
    cock.close()


    Учтите, что sock.accept() операция блокирующая, т.е. программа будет ждать входящего подключения пока оно не случится.

    Пример из документации:
    # Echo server program
    import socket
    
    HOST = ''                 # Symbolic name meaning all available interfaces
    PORT = 50007              # Arbitrary non-privileged port
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                if not data: break
                conn.sendall(data)

    # Echo client program
    import socket
    
    HOST = 'localhost'    # адрес, куда подключаемся,  localhost = 127.0.0.1
    PORT = 50007              # The same port as used by the server
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'Hello, world')
        data = s.recv(1024)
    print('Received', repr(data))
    Ответ написан
    Комментировать
  • Python, json файл преобразовать в словарь python?

    @bbkmzzzz
    Ошибка в Json файле, или модулю что-то не нравиться, например нестандартный разделитель. Откройте файл вручную и посмотрите, что может не нравиться модулю.
    Ответ написан
    Комментировать
  • Почему в Python вылетает ошибка IndexError: list index out of range, при правильном коде?

    @bbkmzzzz
    random.choice выкидывает исключение, если последовательность пустая.

    исходник random.choice

    def choice(self, seq):
            """Choose a random element from a non-empty sequence."""
            try:
                i = self._randbelow(len(seq))
            except ValueError:
                raise IndexError('Cannot choose from an empty sequence') from None
            return seq[i]

    Вот и обращение по индексу, а для генерации рандомного числа берет длину последовательности. Смотрите, почему список пуст или недоступен, если он разделяемый ресурс.
    Ответ написан
    Комментировать
  • Как получить путь до скрипта (Mac OS)?

    @bbkmzzzz
    os.getcwd() - возвращает текущую рабочу директорию
    sys.argv[0] - путь к файлу скрипта
    Ответ написан
    Комментировать
  • Сложить значения одинаковых ключей множества словарей объеденённых списком?

    @bbkmzzzz
    Если без подключения модуля, то можно так:
    a = (
          {'Петя': 6, 'Вася': 8, 'Дима': 11, 'Юля': 3},
          {'Петя': 5, 'Вася': 36, 'Дима': 4, 'Юля': 8},
          {'Петя': 54, 'Вася': 21, 'Дима': 22, 'Юля': 39},
          {'Петя': 61, 'Вася': 48, 'Дима': 71, 'Юля': 73}
        )
    
    resultdict = {}                                            #  результирующий словарь
    
    for dictionary in a:                                     # пробегаем по списку словарей
      for key in dictionary:                               # пробегаем по ключам словаря
        try:
          resultdict[key] += dictionary[key]        # складываем значения
        except KeyError:                                    # если ключа еще нет - создаем
          resultdict[key] = dictionary[key]   
    
    print(resultdict)
    Ответ написан
    Комментировать