Как стать автором
Обновить
1
0

Пользователь

Отправить сообщение

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

что в случае со «Звёздным десантом» фильм заметно лучше книги

А для меня фильм был одним разочарованием. До сих пор не понимаю восторгов по нему. Помню брат прибежал с новостью, что по телевизору будут показывать "Звездный десант", да, по той самой книге. Ждали с нетерпением.
И такой облом в процессе просмотра - никаких боевых костюмов, никаких высадок в индивидуальных десантных капсулах, зато вся стилистика с намёками на очередной рейх.

До сих пор у меня в голове при упоминании этого фильма в голове вертится фраза: "Главное - толпами не ходить"

Думаю, в разделе про unsafe стоит упомянуть, что этот блок дает доступ к 5 конкретным действиям и не выключает полностью проверки Rust
https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html#unsafe-superpowers

To switch to unsafe Rust, use the unsafe keyword and then start a new block that holds the unsafe code. You can take five actions in unsafe Rust that you can’t in safe Rust, which we call unsafe superpowers. Those superpowers include the ability to:

  • Dereference a raw pointer

  • Call an unsafe function or method

  • Access or modify a mutable static variable

  • Implement an unsafe trait

  • Access fields of unions

It’s important to understand that unsafe doesn’t turn off the borrow checker or disable any other of Rust’s safety checks: if you use a reference in unsafe code, it will still be checked. The unsafe keyword only gives you access to these five features that are then not checked by the compiler for memory safety. You’ll still get some degree of safety inside of an unsafe block.

Внесу ясность: self не является ключевым словом, на месте первого аргумента метода может использоваться любое имя, но традиционно это self

Мне кажется, что в ORM очень многое зависит от языка, для которого он реализован. К примеру, на SQLAlchemy можно построить очень понятные и при этом сложные запросы, во многом благодаря тому, что Python очень многое себе позволяет.
Кстати, частенько натыкался в интернете на вопросы типа "посоветуйте для языка N какой-нибудь ORM похожий на SQLAlchemy"

Новость звучит так, как будто в FF для Андроид на данный момент нельзя устанавливать расширения. Я даже удивился и полез в настройки, чтобы убедиться, что в моём Firefox 119.0.1 для Android установлен uBlock Origin, и стоит он там довольно давно. Более того, доступны так же другие расширения для установки.

Что-то явно меняется с расширениями, но мне пока непонятно - что же меняется?

Возможно, вот это будет для вас полезно?
https://docs.python.org/3/howto/logging-cookbook.html#adding-contextual-information-to-your-logging-output
Как-то на одном из проектов автоматически добавляли к логам query_id, но похоже, что и в вашем случае может быть полезно (но если честно, то я особо не вникал).

Плюс pythonjsonlogger.jsonlogger.JsonFormatter, как было сказано в статье, если нужны логи в формате JSON.

У нас сейчас как раз несколько сред. Везде используется одинаковые настройки логгинга, отличаются только уровни логирования, передаваемые через переменные окружения.
Но в целом, спасибо за пример, при некоторых сетапах CI/CD использование файлов-конфигов может оказаться удобнее.

Прятать сложные вычисления внутри вызова .debug() - вообще идея не очень, в таком случае лучше воспользоваться чем-то вроде https://docs.python.org/3/library/logging.html#logging.Logger.isEnabledFor или https://docs.python.org/3/library/logging.html#logging.Logger.getEffectiveLevel, которые работают для любого уровня логирования.

Форматирование строк - операция всё же довольно затратная, если .debug() вызовов много, то лучше использовать С-style форматирование. Даже если аргументы типа user уже известны на момент вызова (а это происходит в 99% случаев).

Если сравнивать с конфигом из статьи, то конечно, это вариант смотрится гораздо лучше. Но я имел в виду задание конфигурации стандартными методами/функциями из модуля logging - .basicConfig(), создание хендлеров, форматтеров и прочее. Зачем вместо этого использовать голый dict - для меня загадка.

Прошу прощения, нужно было это момент сразу уточнить.

UPD: почитал из интереса - действительно выражение считается в рантайме для % и в компайлтайме для f-строк, прошу прощения

f-строки и С-style строки с % не могут считаться во время "компиляции", потому что значения аргументов становятся известны как правило только во время выполнения. Потому что нет смысла использовать заранее известные значения для форматирования строк, проще сразу использовать строковые литералы.

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

Думаю, с примером сразу станет всё ясно.
тут строка-результат формируется до вызова debug (точнее в debug передается уже сформированная строка-результат)

logger.debug(f"User {user} logged in")

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

logger.debug("User %s logged in", user)

Очень искусственный пример. До рефакторинга:

def func():
    result = {
        "speed": 42,
        "coord": (1, -2),
    }
    return result

После рефакторинга:

def func():
    # редактируем методом копипасты и удаления лишнего
    speed = 42,  # забытая запятая
    coord = (1, -2)
    return {
        "speed": speed,
        "coord": coord,
    }

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

При рефакторинге - запросто

А ещё, забытая запятая в конце строки с присваиванием (упомянутое в статье) может подарить тонны WTF??? при попытках разобраться, откуда тут кортеж? И только опыт лишает или сокращает это удовольствие.

a = 42,

Опциональные скобки - это зло. Хотя часто это удобно.

Как минимум не раньше, чем с этим можно будет работать в Jupiyer Notebook или "импортозамещенном" аналоге.

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

Думаю, начинающим будет крайне интересна вот эта ссылка: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
А в ней уже есть ссылки на нужные AWS доки

Каждые 5,5 минут он выбрасывает в космос вещество.

Прошу прощения, я не астроном, но мне кажется тут неточность. Вряд ли этот карлик выбрасывает вещество каждые 5.5 минут. Скорее, дело в прецессии оси вращения, поэтому каждые 5.5 минут ось направлена в сторону Земли и в нашу сторону летит излучение и вещество из джета, которое извергается постоянно.

Поправьте, если ошибаюсь.

Никогда не измеряйте время выполнения python кода таким образом. Используйте https://docs.python.org/3/library/timeit.html
Так же можно использовать соответствующие magic команды в jupyter блокнотах.

Информация

В рейтинге
5 079-й
Зарегистрирован
Активность