• Почему трейт не может быть результатом метода внутри трейта?

    vabka
    @vabka
    Токсичный шарпист
    В первом случае:
    fn chto_to(&self) -> impl StringAnalyzer;
    impl Trait значит, что функция возвращает неизвестную структуру, которая реализует трейт.
    Возвращаемое значение определяется компилятором в момент объявления функции.
    Внутри трейтов он это не может (хотя вроде хотят в будущем разрешить)

    Во втором случае:
    fn lexing<T>(&self) -> T where T: StringAnalyzer;
    Тут возвращаемое значение определяется по месту вызова.

    Если ты хочешь impl Trait использовать в трейтах - ты можешь использовать associated type:
    pub trait NewTrait {
      type AssociatedType: ExistingTrait;
      fn function() -> Self::AssociatedType;
    }
    Ответ написан
    1 комментарий
  • Почему wasm код не генерируется при компиляции rust кода с сырыми указателями?

    bingo347
    @bingo347
    Crazy on performance...
    Начну пожалуй с того, что в первом примере у Вас UB (undefined behavior):
    #[no_mangle]
    pub fn test() {
        // Вот тут на стеке выделено 4 байта
        let mut idx: i32 = 10;
        // Указатель на эти 4 байта
        let ptr = &mut idx as *mut i32;
    
        // По сути указатель на те же 4 байта, но на деле указатель на 40 байт
        let buffer = unsafe { core::slice::from_raw_parts_mut(ptr, 10) };
    
        // И тут мы работаем с этими 40 байтами,
        // но нормальные из них только 4 байта в начале,
        // а остальные смотрят в глубь стека и меняют его
        // то есть перетирают адрес возврата и данные на стеке вызвавшей функции
        for pixel in buffer.iter_mut() {
            *pixel = 0x7d2b7500;
        }
    }
    То есть после завершения данная функция должна не вернуться в вызывающую функцию, а передать управление непонятно куда.

    Ну и еще один момент, это оптимизация, данная функция не имеет сайд эффектов и ничего не возвращает. После инлайна функции core::slice::from_raw_parts_mut и метода Iterator::iter_mut компилятор вполне может понять, что данный код не имеет сайд эффектов, а значит бесполезен и его можно вырезать. Вот собственно он его и вырезает.
    Во втором же примере у нас есть сайд эффект - изменение данных по указателю пришедшему извне через аргументы.

    P.S. Во втором примере кстати тоже можно увидеть работу оптимизации, цикл из 10 итераций, пишущих i32 в смещение по указателю, был заменен на обычные 5 записей i64 в смещение по указателю.
    Ответ написан
    1 комментарий
  • В чем разница между str и &str?

    Erik_Mironov
    @Erik_Mironov
    Старые вопросы: *Dies from cringe*
    str представляет собой неизменяемую последовательность байтов UTF-8 динамической длины где-то в памяти. Поскольку размер неизвестен, его можно обрабатывать только за указателем. Это означает, что str чаще всего используется как &str — ссылка на некоторые данные UTF-8, обычно называемые «срезом строки» или просто «срезом». Срез — это просто представление данных, и эти данные могут быть где угодно, например:

    - В статическом хранилище: строковый литерал "foo"представляет собой файл &'static str. Данные жестко закодированы в исполняемый файл и загружаются в память при запуске программы.

    - Внутри выделенной кучи: String разыменовывает представление &str в строке.

    - На стеке: Например, в следующем примере создается массив байтов, выделенный стеком, а затем он получает представление этих данных как &str:

    use std::str;
    
    let x: &[u8] = &[b'a', b'b', b'c'];
    let stack_str: &str = str::from_utf8(x).unwrap();


    Используйте String, если вам требуется владение строковыми данными (например, передача строк в другие потоки или их создание во время выполнения), и используйте &str, если вам нужно только представление строки.
    Ответ написан
    1 комментарий
  • Как исправить ошибку в конструкции try-except(работает не так как надо) в python3.10?

    @mkone112
    Начинающий питонист.
    >> isinstance(KeyboardInterrupt, Exception)
    False
    Ответ написан
  • Как в питоне задать пути к стандартным папкам?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Если вам надо внутри вашего скрипта создавать, считывать и изменять файлы и папки, опираясь на привязку к «домашней» папке пользователя, можно сделать что-то такое:
    from pathlib import Path
    my_home_dir = Path.home()
    new_folder_name = 'my_new_folder'
    new_folder = Path(new_folder_name)
    new_folder_full_path = my_home_dir / new_folder
    try:
        Path.rmdir(new_folder_full_path)
    except FileNotFoundError:
        pass
    print(new_folder_full_path.is_dir())
    try:
        Path.mkdir(new_folder_full_path)
    except FileExistsError:
        pass
    print(new_folder_full_path.is_dir())


    В скобках замечу
    Следует отметить, что существуют сторонние библиотеки, которые не понимают такие пути. Для таких библиотек приходится получать строчное представление пути.
    Ответ написан
    2 комментария
  • Как в функцию, внутри функции map() передать больше аргументов?

    @deliro
    Не надо использовать ни map, ни filter. Эта дурь в питоне совершенно нечитаема (особенно когда вложена друг в друга и не один раз). Вместо того, чтобы написать map(f, iterable), лучше использовать [f(x) for x in iterable]. Ну или если нужно ленивое исполнение, прям как в map, то генератор (f(x) for x in iterable). Точно также, как вместо filter(predicate, iterable), лучше использовать [x for x in iterable if predicate(x)]

    Отвечая на твой вопрос: [f(x, arg2, arg2) for x in iterable] (скобки квадратные, круглые или фигурные — по вкусу)
    Ответ написан
    Комментировать
  • Как распаковать многомерный список?

    @deliro
    Если глубина заранее неизвестна или варьируется, то проще всего сделать рекурсией. А чтобы не тратить лишнюю память, генераторами:
    def flatten(x):
        if isinstance(x, list):
            for q in x:
                yield from flatten(q)
        else:
            yield x


    >>> list(flatten([1,2,3, [1,2, [3, [[[[4]]]]]]]))
    [1, 2, 3, 1, 2, 3, 4]
    Ответ написан
    Комментировать
  • Что делает этот скрипт?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    FFD9 - последние байты изображения формата jpg.
    Код вытаскивает второе изображение из файла fimrin.jpg и сохраняет в better_fimrin.jpg

    Допустим у нас есть два jpg файла: orange.jpg и apple.jpg (апельсин и яблоко соответственно). Если мы их склеим в 1 файла таким кодом:
    f1 = open('orange.jpg', 'rb')
    f2 = open('apple.jpg', 'rb')
    
    with open('out.jpg', 'wb') as out:
        out.write(f1.read()+f2.read())


    то получим файл out.jpg, который в просмоторщике фото будет выглядеть как апельсин. Хотя на самом деле, после апельсина дописаны байты яблока. Очень упрощено
    orangeblablablaFFD9applelalalalaFFD9

    Код находит индекс FFD9, которые являются концом первого изображения (апельсина), смещает курсор до этих байт (f.seek), затем читает оставшиеся байты, которые являются байтами изображения с яблоком. И сохраняет эти байты в виде нового файла. В общем, вытаскивает скрытое второе изображение из файла. Может быть как часть какого нибудь легкого задания, связанного с криптографией.

    В принципе, код легко ужимается до
    f = open('fimrin.jpg', 'rb')
    content = f.read()
    
    with open('better_fimrin.jpg', 'wb') as out:
        out.write(content[content.index(bytes.fromhex('FFD9')) + 2:])
    Ответ написан
    Комментировать
  • Ошибка match python 3.9.1 invalid syntax?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Спросите у гугла, в какой версии появился match-case, думаю, молчать не будет. Это 3.10
    Ответ написан
    Комментировать
  • Как получить https редирект ссылку в запросе get?

    Vindicar
    @Vindicar
    RTFM!
    > переходя на которую происходит 5-ти секундная проверка
    Это означает, что редирект выполняется средствами JS, а не через коды ответа HTTP 3XX.
    requests умеет обрабатывать только последний вариант, так как она не эмулирует браузер целиком.
    Теоретически правильную ссылку можно выцарапать из содержимого скачанной страницы, но на практике не факт - скорее всего, страницу с проверкой ввели как раз для защиты от скриптов типа твоего.
    Можешь поиграться с пакетом selenium, он позволяет притворяться полноценным браузером - вдруг получится.
    Ответ написан
    2 комментария
  • Фильтрация в списке словарей по динамическим критериям?

    @deliro
    Создать новый список и добавить туда элементы, которые подходят под предикат. Типичный map/filter/reduce

    def filter_by(self, data: list, param: dict) -> list:
        result = []
        for el in data:
            matches = True
            for name, val in param.items():
                if el[name] != val:
                    matches = False
                    break
            if matches:
                result.append(el)
        return result


    Или однострочником

    def filter_by(self, data: list, param: dict) -> list:
        return [el for el in data if all(el[name] == val for name, val in param.items())]


    rule of dumb: если метод/функция меняет свой аргумент, она не должна его возвращать (обычно это значит, что она вообще ничего не должна возвращать), имя метода/функции при этом должно явно говорить, что аргумент меняется (populate, remove_smth, drop_smth). Если метод/функция возвращает что-то, она не должна менять аргументы.

    Но нужно понимать, что сложность создания нового списка — O(n) [при условии, что param достаточно мал и не растёт с увеличением data], а сложность выкидывания элементов по индексу — O(n**2) [потому что сложность операции .pop(idx) — O(n), в цикле по data — ещё O(n), итого O(n**2)]
    Ответ написан
    Комментировать
  • Как вставить assembler код в программу на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну в общем из предыдущих вопросов автора становится понятно, зачем юному гению это понадобилось
    Осталось только открыть ему малюсенький секрет, где у нас работает РНР, а потом уточнить, у какого компьютера наш вундеркинд хочет узнать параметры процессора.
    Реальность его немного разочарует, когда выяснится, что почему-то у всех посетителей его сайта оказываются идентичные процессоры!

    В общем вопрос из той серии что про FFI рассказывать явно ни малейшего смысла
    Ответ написан
    9 комментариев
  • Как правильно тестировать приложение?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Возможно ли тестировать без отправки запросов в УТМ

    Можно - используйте Mock
    https://docs.python.org/3/library/unittest.mock.html

    Вот из примеров реализации:
    https://habr.com/ru/post/141209/

    Еще как вариант - поднять сервер, который сперва работает как прокси, а затем работает как имитатор запросов
    wiremock.org
    Ответ написан
    Комментировать
  • В чем смысл пакетов в python?

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

    вы можете собрать лектрощиток в подьезде из проволочек, пружинок, изоленты и горячего клея на скрутках, а можете поставить стандартную дин-рейку. на нее установить стандартные автоматы и УЗО, использовать стандартные провода, наконечники и клеммники к ним. Ту же самую функциональость можно получить из дерьма и палок, но она не будет надежной и выглядеть будет соответствующе, а любой таракан устроит пожар. С пакетами тоже можно устроить "пожар", особенно если не умеешь программировать и "накрутить проводов" кажется более простым решением.
    Ответ написан
    Комментировать
  • Как расшифровать RSA с помощью Python?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Как такой текст расшифровать уже на Python 3


    К примеру вот так:

    import rsa
    import base64
    
    PRIVKEY = '''<<<SOMEDATA777
    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEA3bv1e8E+bR53cvDwwwAF3Yhc+g47OvFpmmb0oi/H5xV/u1us
    UCBqgC0Apz1CcAAQJM/0TrKF7alfDeAvUD2E0E8SU7UxBHc3Bsn75Gs0wt3kVzqL
    TBfBRBW/qVdcNINkAnQUrOJ784OX8bMbH1DtMbvZAoBHFOaEv5G/fUWICBARsEsl
    hSvFxCXyY4tBwDgPTP1QaF/pzlHhl2L8EVUNNjworEoG897uaDwyJbbShfMlrgZG
    zEnNFr6WYlCsHAlKoWKYq2Duag4ojPV7bh9sVyXCketlZHkYgLb0suw5jZZYuZ42
    UhPtQYNKpDmWpnrECkUD6T/1UXTRHvubrKnvywIDAQABAoIBADcHs/gf0KdyPUD4
    jThIJCyD8Fda+tY5HfVlAefSpfEzA71zFgPY17Wx9YyMBpYXXepU9hQl+FkwhNfD
    wNpQOkscpLbDrEOodq6nqG1bMf/+4/HGJNYguyVzpFqZxNd/mG2Hc64ok4yvJyGk
    SuHtysBiF4yoW3vTbjTBLl4fyI//PquJk3pWE6n30ooVs/ZDIldDYxLTzaRhjGIl
    lSjq2K2ItlsOav912euGebjQXWXAd3m0F9ngrFLjljmCrE8qgDeuFmxd7x5Czvua
    AYgTJzMSbfBCSti1xOrmQGUX+BEhXVhlmhn5slaPh6h1L71uoeipAZS21QbXXAI3
    fT5nsdkCgYEA8yxRWMfZhZzRrCv/HAwzyZUfkfBRXqy+aacO6lUnE15qPb4aE8Em
    gYFCB20hsJczKakxQUiClRCn6yOfgLnJG/vq2vR5aydV7OEXBe6bT3j4RbGuCaZZ
    /RzuehoZqSpexclDFZvk54QgmfNZjoZxf/IAt+ZN6tUL8z51j4+JS78CgYEA6W4k
    N4xE0zCLds5DakeqbD3oEE9fY5NKJIp61JR4HVBASJU/e91SPWEbrAfcMTayTav5
    hyz7vN7aEh2UAeG5945PdmiATWnROSmQN3vin4AsLmeUFJHGL4qT77k5Wt9Ql43k
    QbEyjw+wQAdxnghLoiHyozYzsZhvbq942bvgDvUCgYBo1t+PdkIq38xp/WH0VrJx
    I3DD+6cpOTKy3EqK7wF00Uzep7oYcDrItNCh4QQYXWe6e2535eoemFq8/tPCrNau
    0PKVSbebYg8inHzPmuqs3cu0SIFvOaAshy+txtjvXQwVG8tnYpnS0t03Ynpm/0Gp
    1s1Ge+115DpNucz3gvu/gwKBgDOM0FC4GGbvPI1jJb4tz3QSA9K+RJmP6HrDXjbe
    BtyqYVfmJdvr14KYlGzcW4M+ygefJ/7zLzDZoh0IDSyRNel2sxO6JkNyT/Mou6GV
    KUoCGz+wPiKAwtyy5NK2+/SWhozBmBvtzvWLCGhLfIri2BkZGCV1Ddt1h35RIAYt
    mGCVAoGAK+IfA2Nkqi09xsU1KPPJTL4P54OsEbE5fNm+hxL1jpfU3cz7VV9X+yvV
    fseNn1qkQTvC4JERIypOnkti3xpsWaedP5fHHqveSDeR6ObRRTFcM990EogN9IzE
    WOUCpOARkqvdlQO5UwP4fVgJmKERicoHjsuWOf4byZad7FjJYE4=
    -----END RSA PRIVATE KEY-----
    SOMEDATA777'''
    
    privkey = rsa.PrivateKey.load_pkcs1(
        PRIVKEY,
    )
    
    crypted_text = "qwcxZgHZ1hccWeZG6UHV3s7qLTDBtz+tUiv/qOB9gxtm9JQRXnUb+MWXxU4oU+ek0y5EMR+QTh7w u0WivMjNxmmmvpWkBkcnigsqrosqnksvV5OSmcyu8/dMDdRpT87fsmTjrBlwrXBy+r9fZqQ2eILH X0dEsUNexQy2z24FCVJRpNTwH9bXpgCJkuQKOOA5jze2dUIA+78es1f09B3dQQEEWF5jNv2NlkKa L3teqYe1StJ0V8ButejzDoXzTxjgTLA1J7rJgbiJ7zooPRZafZakZwGDO2c2bB9fGDYd90TD4Y0G mBybEs/nThjGry/F+dtxu1df0O6HgPTDnnol6Q=="
    crypted_text = base64.b64decode(crypted_text.encode())
    
    message = rsa.decrypt(crypted_text, privkey)
    print('DECRYPTED> ', message.decode())


    DECRYPTED> PHP is my secret love.
    Ответ написан
    5 комментариев
  • Реально ли поменять направление?

    Hivemaster
    @Hivemaster
    Админ, который хочет программировать
    Нет, программисты выбирают свою участь раз и навсегда. Пытавшиеся сменить язык пропадают без вести.
    Ответ написан
    Комментировать
  • На чем написать rest api для kanban доски?

    @ghostiam
    На Go писатель, серверов пинатель.
    На GO, "православный" стек, это стандартный пакет net/http + какой нибудь внешний роутер, например chi, либо вообще не http/rest, а gRPC (если мы говорим об API).
    Для БД чистый SQL, максимум какой нибудь маппер на структуру, типа sqlx(можно ещё использовать sql builder, но в IDE Goland хорошая поддержка чистого sql).

    ORM очень не советую, есть конечно gorm(генерирует запросы не эффективно, N+1 при связях), для мелких проектов хватит, но вот со сложными запросами любая ORM не справляется.
    Я категорически против ORM, так как за всё время моей работы в вебе, в любом проекте, самым слабым звеном всегда была ORM(долбит кучей запросов БД, когда на чистом sql это 1-2 запроса), либо программист, вместо того, чтобы написать запрос вида "SELECT SUM(amount) FROM book WHERE author = 'Petya'", достаёт все записи и суммирует это в коде(делает работу за БД + тратит ресурсы БД на чтение данных с диска и передачу их по сети).

    Не нужно использовать фреймворки, это не даст опыта написания на go(как и в большинстве языков).
    Go используют, где производительности других решений не достаточно, или нужна многопоточность, что фреймворки так себе обеспечивают.
    Шаблоны в go практически не использую, пишу фронт на vuejs и обращаюсь к go api.
    Есть генераторы документаций, но я тут не посоветую, их нужно тестировать отдельно, у каждого есть свои плюсы и минусы, сам использую другое решение(опишу в конце).

    Самое главное, побыстрее понять, что на go нужно писать как на go, а не так как привыкли в других языках, потому-что, в нём нет привычных классов, строгая типизация, процесс живёт долго и могут быть race condition(гонка состояний) при многопотоке(веб сервер многопоточный), поэтому о подходах из php советую поскорее забыть.

    В своих проектах(в проде), использую go только как сервис предоставляющий апи. Недавно начал использовать grpc-gateway(так как использую gRPC, но так же необходимо делать API доступное через web), проект позволяет описать всё что необходимо в proto файлах (см. gRPC), сгенерировать модели и обёртки под большенство языков + документацию в OpenAPI 2.0. Это не фреймворк, это обёртка над стандартным net/http, которая сразу валидирует и маппит данные на структуру.

    Коротко:
    Для новичка, советую забыть про фреймворки(они не помогут в изучении) и ORM(не эффективно).

    Использовать для веб сервера:
    net/http - встроен в го
    chi(проще) или gorilla/mux - роутер

    Для взаимодействия с БД:
    sqlx - обёртка над стандартным пакетом sql, но позволяет сразу считывать данные в структуру, без ручного сканирования.
    Ответ написан
    3 комментария
  • Почему не устанавливаетсЯ lxml?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Вы не указали ни систему, ни ошибку - поэтому рассмотрим проблемы чайников с установкой пакетов в системе windows:
    Быстрее всего пакет пытается скомпилироваться, а у вас не установлены соответствующие компиляторы.
    В таком случае можно установить уже скомпиленный пакет:
    https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
    Ответ написан
    Комментировать
  • Телеграм бот на питоне: ошибка переменная is not defined?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Разберитесь сначала с основами языка. Учебник какой-нибудь прочитайте.
    Ответ написан
    Комментировать