• Существуют ли API для получения строящихся объектов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    В OSM есть соответствующий тег: landuse=construction.
    Запрашивать объекты с таким тегом можно, например, через Overpass API.
    Но тут вопрос в качестве разметки OSM интересующей вас территории, а так же в актуальности этих данных. Разметка осуществляется волонтёрами комьюнити, поэтому никто не ручается относительно точности и актуальности данных.
    Можно ещё посмотреть в сторону кадастровых карт, но боюсь, что там тоже не всё так быстро обновляется. Однако API у них тоже есть. Тут я не специалист.
    Ответ написан
    5 комментариев
  • Как работает asyncio.sleep?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть такой системный вызов select (а также подобные ему poll, epoll итд), суть которого - передать массив файловых дескрипторов (частный случай - сетевых соединений) и затем при получении событий ввода-вывода получить список тех дескрипторов, в которых произошёл ввод-вывод. Важно понимать, что при это программа "засыпает", передаёт управление ОС и не тратит ресурсов. ОС сама разбудит программу при наступлении нужных событий (записался файл, пришли новые сетевые байтики итд). Высокопроизводительные сетевые приложения (типа nginx, haproxy итд) используют подобный подход для того, чтобы эффективно обрабатывать большое количество сетевого трафика одновременно.

    asyncio работает как раз примерно по тому же принципу. Когда случается ввод-вывод, нужная функция "засыпает", а управление передаётся потоку событий. Соответственно, он либо находит задачу, которая ожидает выполнения и передаёт ей управление, либо видит, что все задачи уже одидают какого-нибудь ввода-вывода и запускает select на все ожидающие дескрипторы (возможно, в реальности используется не select, а какой-то из его аналогов, но это для нас сейчас непринципиально). Как только приходит событие, программа просыпается, поток событий находит нужное событие и передаёт управление соответствующей задаче, которая его ожидала. Это позволяет очень эффективно в один поток работать с задачами, которые много ожидают ввода-вывода, но мало выполняют реальной процессорной работы.

    Обычный ввод/вывод является блокирующим: пока не будет выполнена операция (чтение/запись/передача/приём), программа приостанавливает свою работу в ожидании. В asyncio весь ввод-вывод является неблокирующим: операции ввода-вывода не приостанавливают работу программы, а позволяют перейти к другим ожидающим задачам.

    Обычный вызов sleep приводит к приостановке и засыпанию программы на указанное время (с передачей управления ОС), и в ней в это время ничего не выполняется. Как только время истечёт, ОС вернёт управление программе. Всё это время программа не работает, события ввода-вывода не обрабатывает.

    В то же время asyncio.sleep возвращает управление потоку событий, а не ОС, что позволяет переключиться на выполнение других задач, обработать новые события итд итп. Программа не останавливается и управление ОС не передаёт (ну, кроме сна в процессе исполнения select), поэтому asyncio.sleep приводит к неблокирующему засыпанию, не мешающему выполнять задачи, которым ждать окончания сна одной конкретной задачи не нужно. Когда истечёт не менее чем указанное в asyncio.sleep время, поток событий вернёт управление приостановленной задаче.

    Важно отметить, что и sleep, и asyncio.sleep не гарантируют, что функция возобновит работу через указанное число секунд, а не позже, но при этом sleep делает это значительно точнее. Потому что возврат в вызвавшую asyncio.sleep функцию может произойти только из потока событий и только при условии, что поток событий не вернёт управление какой-то другой задаче.

    Например, пусть есть функция, которая делает asyncio.sleep(1), затем три секунды работает числомолотилка без ввода-вывода. Тогда если у нас выполняются подряд с интервалами 0.1 с три таких функции, то первая задержит на 2.9 секунд возврат управления второй, а вторая - на 5.8 с третьей.

    Это общий принцип, разумеется, там много нюансов и особенностей реализации.
    Ответ написан
    Комментировать
  • Как работает asyncio.sleep?

    Vindicar
    @Vindicar
    RTFM!
    Идея простая.
    Асинхронные приложения - это набор пар "операция - обработчик", где операция - это некоторый длительный процесс (скажем, вводы/вывод), который не требует постоянного внимания со стороны кода. Когда операция завершается, выполняется её обработчик. Этот обработчик может планировать другие операции, и так далее.

    Корутины - это такие функции, которые умеют сохранять своё состояние, и восстанавливать его. Т.е. когда корутина делает await-вызов, она начинает длительную операцию, а обработчик этой операции просто восстанавливает контекст корутины и продолжает её выполнение.

    Соответственно, await-вызов сохраняет текущий контекст корутины, и планирует новую длительную операцию. Какую - зависит от того, что идёт после await. Эта операция представлена тем или иными awiatable значением (Future, Task и т.п.).

    Рабочий цикл (loop, его также называют реактор) просто проверяет текущие операции. Как только одна из них завершилась, он выполняет её обработчик. А потом продолжает проверять остальные активные операции.

    Ключевой момент - выполняет обработчик, а только потом проверяет остальные операции. Т.е. если обработчик планирует операцию через await - это не проблема, она будет выполняться наравне с остальными. А вот если обработчик просто делает что-то длительное, он не возвращает управление циклу, и не даёт выполняться остальным операциям.

    asyncio.sleep() планирует ничего не делающую операцию, которая завершится успехом через заданное время. Поэтому её выполнение не мешает циклу-реактору. Просто ещё один await вызов, который приостанавливает текущую корутину и возвращает управление реактору.

    time.sleep() ничего не знает о реакторе и асинхронных операциях. Она приостанавливает выполнение обработчика, не прерывая его и не отдавая контроль реактору. Поэтому на время time.sleep() (или любой длительной синхронной операции) спит вся программа.
    Ответ написан
    5 комментариев
  • Как написать свой компилятор?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Трансляторы
    Седой и строгий
    Содержимое этой книги в ответ не вместится.
    60b76e70c748b529799442.jpeg
    А ваш вопрос на столько общий, что короче не получится.
    Ответ написан
    3 комментария
  • Как заставить def работать?

    Vindicar
    @Vindicar
    RTFM!
    Поучи язык. Просто поучи, без ботов.
    def объявляет функцию, но не вызывает её.
    Ты её объявляешь внутри record_volume(), но ничего с ней не делаешь.
    Ответ написан
    Комментировать
  • Может ли маржинальность быть более 100%?

    vabka
    @vabka
    Токсичный шарпист
    1. Выручка не может быть отрицательной. Отрицательной может быть прибыль
    2. При расчёте маржинальности используется не себестоимость товара, а переменные затраты, которые кроме себестоимости самого товара могут включать в себя что-то ещё (например расходы на привлечение клиентов)

    Если ты продаёшь в убыток, то маржинальность будет отрицательной, но не меньше, чем -100%
    Ответ написан
    1 комментарий
  • Почему нету функции .click() в Appium WebDriver?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    почему нету функции .click()

    функция есть
    https://appium.io/docs/en/commands/element/actions...

    но в твоем экземпляре пустого объекта ее нет тк он пустой, None
    Ответ написан
    Комментировать
  • Почему нету функции .click() в Appium WebDriver?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Метод .find_element_by_id ничего не находит, возвращает None
    А у объекта None нет метода .click

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужна новая нейросеть которая будет обучена на выборке обычных постов. И на выборке ответов GPT.
    Supervized. Тоесть мы как учитель - указываем где какие.

    Простые частотные метрики текста такие как tf/idf здесь не подходят. Скорее всего. Тут нужна
    структурная. Я заметил что GPT часто выдает ответ в виде однородной структуры.
    Типа введение. Пункты перечислений. И какое-ро резюме.

    Люди обычно такой схемы не придерживаются.
    Ответ написан
    2 комментария
  • Программа работает неправильно, что сделать, чтобы программа заработала?

    ElonMask2
    @ElonMask2
    Autor of Tesla Machini and SpaxeX
    s = [10,
    -5,
    -2,
    -1,
    6,
    3,
    0,
    -2,
    -2,
    -3,
    -3,
    0,
    5,
    8]
    
    ss = []
    window = 2
    for _ in range(0, len(s)-2):
       window += 1
       frame = s[window - 3:window]
       ss.append(sum(frame))
    
    mi = ss.index(min(ss))
    slice = s[mi: 3 + mi]
    print(slice)
    Ответ написан
    1 комментарий
  • Зачем именно нужны связи в бд?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    В Вашей базе уже есть связь мезду таблицами Message и User. Поля Message.userid => User. id связывают таблицу Message с User
    К Вашей схеме Вы можете только добавить внешний ключ который не позволит вставлять сообщения от несущуствующего пользователя
    CREATE TABLE User (
        id INTEGER NOT NULL AUTO_INCREMENT,
        login VARCHAR(255) NOT NULL,
        password VARCHAR(255) NOT NULL,
        status INTEGER NOT NULL,
        PRIMARY KEY (id)
    );
    
    CREATE TABLE Message (
        id INTEGER NOT NULL AUTO_INCREMENT,
        userid INTEGER NOT NULL,
        message VARCHAR(255) NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY (userid) REFERENCES User(id)
    );


    https://sqlize.online/sql/mysql57/35f0f9087119cc77...
    Ответ написан
    8 комментариев
  • Зачем именно нужны связи в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно поговорить об аномалиях. Например в твоей системе я могу (теоретически) добавить месседж
    который не принадлежит ни одному пользователю системы. Я просто сделаю

    insert into message(9999999, -1, "Mua-haha...");

    И у меня есть пост от анонимоса который не зарегистрирован как пользователь.

    Разумеется можно полагаться на логику твоего приложения и думать что такая ситуация невозможна
    но с точки зрения БД она вполне возможна потому как родственная связь User + Message нигде не объявлена.
    И SQL позволяет это сделать.

    Чтоб поправить ситуацию надо эту связь добавить и тогда я не смогу создать фейковые посты от анонимосов.
    ALTER TABLE Message
    ADD FOREIGN KEY (userid) REFERENCES users(id);

    По умолчанию констрейнт создается с опцией restict (это было в Оракле как в Майскл - не знаю)
    и это гарантирует что невозможно также удалять родительские записи пока есть дочки.
    Для скорости ссылочные ключи всегда - индексированы.

    Рассуждать на тему вреда от аномалий - это просто терять время. Каждый владелец БД сам решает
    какие уровни строгости ему вводить. Вообще любая теория касаемая БД - по сути просто развивает
    идею строгости НФ1,2,3,4,5,6 и ссылочных ограничений.

    Будет ли виден пост от анонимосов - это тоже другой вопрос и он не имеет отношения к обсуждаемой
    теме. Ведь тема касается именно логичности данных в БД а не тем методам которые их отображают.

    По сути вопрос сводится к тому как не создавать мусор в БД.
    Ответ написан
    2 комментария
  • Как инициализировать декоратор в классе, а внутри использовать этот декоратор?

    Vindicar
    @Vindicar
    RTFM!
    Ты хочешь поместить хэндлеры в класс?
    Я в таких случаях делаю немного иначе.
    Делаю свой декоратор, который принимает те же параметры, что и ботовый, но просто сохраняет их в отдельном атрибуте декорируемого метода. Благо методу можно создать новый атрибут через setattr() или простым присваиванием.
    При конструировании экземпляра класса через dir() перечисляю содержимое класса, ищу методы, среди них ищу методы с моим атрибутом (т.е. те, которые были декорированы). Для каждого такого метода получаю bound method (через getattr(self, method_name)) и вызываю оригинальный декоратор на нём с сохранёнными параметрами. Ведь декоратор - это функция, его можно вызывать как функцию.
    Часть, связанную с конструированием, можно спрятать или в родительском абстрактном классе, или в метаклассе, чтобы не повторять для каждого класса с обработчиками.
    Ответ написан
    Комментировать
  • Почему не работает IF-ELSE?

    Vindicar
    @Vindicar
    RTFM!
    1. Как проверял? Просто пытался угадать? Рандом - штука такая, могло просто не везти.
    2. Если пользователь с первого раза введёт правильный key, условие цикла сразу будет False, и цикл не выполнится - а значит, не выполнятся и ifы.

    Я бы посоветовал сделать так:
    max_tries = 5  # число попыток
    key = -1  # заведомо некорректное значение
    for i in range(1, max_tries+1):
        key = int(input(f'Попытка №{i}: '))
        if key == lock:
            print(f'Угадал c {i}-й попытки!')
            break
    else:  # этот else относится к for! 
        # он выполнится, если for НЕ БЫЛ прерван по break
        print('Попытки кончились. =(')
    Ответ написан
    1 комментарий
  • Зачем надо (1) в COUNT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    С практической точки зрения - надо смотреть план исполнения запроса. Там будет указан тип сканирования и предикат как БД фильтрует строки. Если план для
    SELECT (1)
    не отличается от
    SELECT (*)
    то тогда можно считать что это - одно и тоже.

    Почему обсуждение теоретического SQL я считаю здесь вредным и бесполезным? Потому что ни я ни
    кто либо из присуствтующих стандарт SQL не читал. Это - закрытый и платный документ. И
    обычно нам достается не текст стандарта а текст самой реализации на Oracle/PG/MySQL.
    Вот и говорим о реализации а не о стандарте. А реализации бывают разные. В оракле например
    требуется фейковая табличка dual для пустых безтабличных запросов. В других dbms
    - фейковая табличка не нужна. Синтаксис другой.

    Если кто-либо из присуствующих читал стандарт SQL и знает как объявлено поведение count() - то прошу
    привести хотя-бы цитату.
    Ответ написан
    1 комментарий
  • Почему пайтон не видит глобальную переменную?

    Vindicar
    @Vindicar
    RTFM!
    1. Судя по отступам, у тебя get_answer() заканчивается на строке answer = input("Введите слово: ")
    2. Прежде чем упоминать переменную как глобал, она должна быть глобально определена, т.е. ей должно быть присвоено значение вне функции.
    3. Нафига тут вообще глобальная переменная?
    Ответ написан
  • Можно ли эмулировать нажатие на кнопку на сайте библиотекой Бютифул суп?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    На Авито эту кнопку сделали как раз для того, чтобы парсеры обламывать.
    Ответ написан
    2 комментария
  • Как бесконечное количество трехмерных пространств расположенных на четвертой оси образуют четырехмерное пространство?

    Griboks
    @Griboks
    Человек не может представить четырёхмерное пространство. Но зато вы можете представить его модель, например как пространство + время или как поле четырёхкомпонентных векторов.
    Ответ написан
    Комментировать
  • Почему метод get не работает в цикле?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы предлагаете нам гадать тут на кофейной гуще?
    Никаких входных данных, по которым можно было бы судить о причине неработоспособности вашего кода вы не предоставили.
    Я могу перечислять возможные причины вечно!
    - может быть в index.html мало или нет данных
    - возможно вы неправильно ищете элементы в html
    - некорректно сформирована ссылка с пагинацией (кстати. почему не пользуетесь параметрами, а лепите в урл?)
    - сайт имеет защиту от скачивания тпым перебором чисел, может быть ему нужен еще какой-то формальный параметр
    - вы не находите куда сохраняется результирующие файлы из-за непонимания что такое текущий каталог
    - вы не дожидаетесь ваших 10 секундных таймаутов
    - вы не в тот каталог смотрите в поисках результатов
    - как-то не так запускаете и не видите ошибок, например с доступом.

    С учетом того, что вы даже сюда скопировали код как-то косо и косо подменили куски строк в коде на плейсхолдеры, может быть что угодно из перечисленного
    Ответ написан
    Комментировать
  • Как сохранить объект с кирилицей в файл формата JSON на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Спорим у вас винда?
    Прочитайте спецификацию функции open. В частности про параметр encoding.
    Когда записываете текст в виде байтов (а в файлах он именно так хранится), то нужно понимать какой кодировкой вы кодируете не ascii-символы.
    Вы явно не указываете кодировку, поэтому выбирается кодировка по умолчанию. Посмотреть что у вас там по умолчанию можно вот этой фунцией sys.getdefaultencoding()
    Именно в такой кодировке нужно открывать ваш файл на чтение, чтобы увидеть там русские буквы.
    В винде у вас скорее всего одна из двух кодировок там может быть. И она разная в зависимости от того в консоли вы запустили свою прогу, или в IDE. А ещё подстава - в винде по умолчанию однобайтовые кодировки, поэтому не все символы можно в них представить!
    С этим в линуксе гораpдо лучше. По умолчани везде utf-8.

    Вот, кстати, можете проверить что получится для понятности:
    > 'íåæèëîãî'.encode('latin1').decode('cp1251')
    'нежилого'
    Ответ написан
    1 комментарий