Если я правильно понимаю ситуацию, у оператора нет онлайн доступа к информации о расходах клиента в роуминге. Поэтому выставление счёта происходит после того, как роуминг-операторы, к которым клиент был подключен, выставят счёт "домашнему" оператору. Поправьте, если я ошибаюсь.
что в случае со «Звёздным десантом» фильм заметно лучше книги
А для меня фильм был одним разочарованием. До сих пор не понимаю восторгов по нему. Помню брат прибежал с новостью, что по телевизору будут показывать "Звездный десант", да, по той самой книге. Ждали с нетерпением. И такой облом в процессе просмотра - никаких боевых костюмов, никаких высадок в индивидуальных десантных капсулах, зато вся стилистика с намёками на очередной рейх.
До сих пор у меня в голове при упоминании этого фильма в голове вертится фраза: "Главное - толпами не ходить"
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.
Мне кажется, что в ORM очень многое зависит от языка, для которого он реализован. К примеру, на SQLAlchemy можно построить очень понятные и при этом сложные запросы, во многом благодаря тому, что Python очень многое себе позволяет. Кстати, частенько натыкался в интернете на вопросы типа "посоветуйте для языка N какой-нибудь ORM похожий на SQLAlchemy"
Новость звучит так, как будто в FF для Андроид на данный момент нельзя устанавливать расширения. Я даже удивился и полез в настройки, чтобы убедиться, что в моём Firefox 119.0.1 для Android установлен uBlock Origin, и стоит он там довольно давно. Более того, доступны так же другие расширения для установки.
Что-то явно меняется с расширениями, но мне пока непонятно - что же меняется?
У нас сейчас как раз несколько сред. Везде используется одинаковые настройки логгинга, отличаются только уровни логирования, передаваемые через переменные окружения. Но в целом, спасибо за пример, при некоторых сетапах CI/CD использование файлов-конфигов может оказаться удобнее.
Форматирование строк - операция всё же довольно затратная, если .debug() вызовов много, то лучше использовать С-style форматирование. Даже если аргументы типа user уже известны на момент вызова (а это происходит в 99% случаев).
Если сравнивать с конфигом из статьи, то конечно, это вариант смотрится гораздо лучше. Но я имел в виду задание конфигурации стандартными методами/функциями из модуля logging - .basicConfig(), создание хендлеров, форматтеров и прочее. Зачем вместо этого использовать голый dict - для меня загадка.
Прошу прощения, нужно было это момент сразу уточнить.
UPD: почитал из интереса - действительно выражение считается в рантайме для % и в компайлтайме для f-строк, прошу прощения
f-строки и С-style строки с % не могут считаться во время "компиляции", потому что значения аргументов становятся известны как правило только во время выполнения. Потому что нет смысла использовать заранее известные значения для форматирования строк, проще сразу использовать строковые литералы.
Вот если честно, я встречал такое мнение, но лично я не вижу особой разницы: использовать файл-конфиг или использовать отдельный метод/функцию/модуль для общей настройки логгинга. Но, на сколько я понимаю, это справедливо только для языков, не требующих перекомпиляции при изменениях кода. Использовал оба подхода. Какие есть существенные аргументы в пользу использования файлов-конфигов?
Думаю, с примером сразу станет всё ясно. тут строка-результат формируется до вызова debug (точнее в debug передается уже сформированная строка-результат)
logger.debug(f"User {user} logged in")
А тут - строка-результат формируется внутри вызова debug, потому что сам вызов содержит только набор аргументов, соответственно, при уровне INFO новая строка формироваться не будет.
Аннотации типов могут помочь, но в процессе, особенно на начальных этапах рефакторинга, можно просто не обратить внимания или забить на то, что IDE что-то там подчеркивает.
А ещё, забытая запятая в конце строки с присваиванием (упомянутое в статье) может подарить тонны WTF??? при попытках разобраться, откуда тут кортеж? И только опыт лишает или сокращает это удовольствие.
a = 42,
Опциональные скобки - это зло. Хотя часто это удобно.
Каждые 5,5 минут он выбрасывает в космос вещество.
Прошу прощения, я не астроном, но мне кажется тут неточность. Вряд ли этот карлик выбрасывает вещество каждые 5.5 минут. Скорее, дело в прецессии оси вращения, поэтому каждые 5.5 минут ось направлена в сторону Земли и в нашу сторону летит излучение и вещество из джета, которое извергается постоянно.
Никогда не измеряйте время выполнения python кода таким образом. Используйте https://docs.python.org/3/library/timeit.html Так же можно использовать соответствующие magic команды в jupyter блокнотах.
Если я правильно понимаю ситуацию, у оператора нет онлайн доступа к информации о расходах клиента в роуминге. Поэтому выставление счёта происходит после того, как роуминг-операторы, к которым клиент был подключен, выставят счёт "домашнему" оператору.
Поправьте, если я ошибаюсь.
А для меня фильм был одним разочарованием. До сих пор не понимаю восторгов по нему. Помню брат прибежал с новостью, что по телевизору будут показывать "Звездный десант", да, по той самой книге. Ждали с нетерпением.
И такой облом в процессе просмотра - никаких боевых костюмов, никаких высадок в индивидуальных десантных капсулах, зато вся стилистика с намёками на очередной рейх.
До сих пор у меня в голове при упоминании этого фильма в голове вертится фраза: "Главное - толпами не ходить"
Думаю, в разделе про unsafe стоит упомянуть, что этот блок дает доступ к 5 конкретным действиям и не выключает полностью проверки Rust
https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html#unsafe-superpowers
Внесу ясность:
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 - для меня загадка.Прошу прощения, нужно было это момент сразу уточнить.
f-строки и С-style строки с % не могут считаться во время "компиляции", потому что значения аргументов становятся известны как правило только во время выполнения. Потому что нет смысла использовать заранее известные значения для форматирования строк, проще сразу использовать строковые литералы.
Вот если честно, я встречал такое мнение, но лично я не вижу особой разницы: использовать файл-конфиг или использовать отдельный метод/функцию/модуль для общей настройки логгинга.
Но, на сколько я понимаю, это справедливо только для языков, не требующих перекомпиляции при изменениях кода.
Использовал оба подхода. Какие есть существенные аргументы в пользу использования файлов-конфигов?
Думаю, с примером сразу станет всё ясно.
тут строка-результат формируется до вызова
debug
(точнее вdebug
передается уже сформированная строка-результат)А тут - строка-результат формируется внутри вызова
debug
, потому что сам вызов содержит только набор аргументов, соответственно, при уровне INFO новая строка формироваться не будет.Очень искусственный пример. До рефакторинга:
После рефакторинга:
Аннотации типов могут помочь, но в процессе, особенно на начальных этапах рефакторинга, можно просто не обратить внимания или забить на то, что IDE что-то там подчеркивает.
При рефакторинге - запросто
А ещё, забытая запятая в конце строки с присваиванием (упомянутое в статье) может подарить тонны WTF??? при попытках разобраться, откуда тут кортеж? И только опыт лишает или сокращает это удовольствие.
Опциональные скобки - это зло. Хотя часто это удобно.
Как минимум не раньше, чем с этим можно будет работать в Jupiyer Notebook или "импортозамещенном" аналоге.
Думаю, начинающим будет крайне интересна вот эта ссылка: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
А в ней уже есть ссылки на нужные AWS доки
Прошу прощения, я не астроном, но мне кажется тут неточность. Вряд ли этот карлик выбрасывает вещество каждые 5.5 минут. Скорее, дело в прецессии оси вращения, поэтому каждые 5.5 минут ось направлена в сторону Земли и в нашу сторону летит излучение и вещество из джета, которое извергается постоянно.
Поправьте, если ошибаюсь.
Никогда не измеряйте время выполнения python кода таким образом. Используйте https://docs.python.org/3/library/timeit.html
Так же можно использовать соответствующие magic команды в jupyter блокнотах.