Можно ли в Python создавать бинарные файлы? Конечно можно.
Для этого в Python есть следующие инструменты:
▫️ тип данных bytes и bytearray
▫️ открытие файла в режиме wb (write binary) или rb (read binary)
▫️ модуль struct
Про модуль struct поговорим в первую очередь.
Файл в формате JSON или Yaml внутри себя содержит разметку данных. Всегда можно определить где список начался а где закончился. Где записана строка а где словарь. То есть формат записи данных содержит в себе элементы разметки данных.
В binary-файле данные не имеют визуальной разметки. Это просто байты, записанные один за другим. Правила записи и чтения находятся вне файла.
Модуль struct как раз и помогает с организацией данных в таком файле с помощью определения форматов записи для разных частей файла.
Модуль struct преобразует Python-объекты в массив байт, готовый к записи в файл и имеющий определённый вид.
Для этого всегда следует указывать формат преобразования (или, как оно здесь называется - запаковки).
Формат нужен для того, чтобы выделить достаточное количество байт для записи конкретного типа объекта. В последствии с помощью того же формата будет производиться чтение.
При этом следует помнить что мы говорим о типах языка С а не Python.
Именно формат определяет, что записано в конкретном месте файла, число, строка или что-то еще.
Вот какие токены формата у нас есть.
Помимо этого, первым символом можно указать порядок байтов. На разных системах одни и те же типы данных могут записываться по-разному, поэтому желательно указать конкретный способ из доступных. Если этого не сделать, то используется символ '@', то есть нативный для текущей системы.
В строке формата мы пишем в каком порядке и какие типы собираемся преобразовать в байты.
Запакуем в байты простое число, токен "i".
>>> import struct
>>> struct.pack('=i', 10)
b'\n\x00\x00\x00'
Теперь несколько float, при этом нужно передавать элементы не массивом а последовательностью аргументов.
>>> struct.pack('=fff', 1.0, 2.5, 4.1)
b'\x00\x00\x80?\x00\x00 @33\x83@'
Вместо нескольких токенов можно просто указать нужное количество элементов перед одним токеном, результат будет тот же.
>>> struct.pack('=3f', 1.0, 2.5, 4.1)
b'\x00\x00\x80?\x00\x00 @33\x83@'
Теперь запакуем разные типы
>>> data = struct.pack('=fiQ', 1.0, 4, 100500)
я запаковал типы float, int и unsigned long long (очень большой int, на 8 байт)
b'\x00\x00\x80?\x04\x00\x00...'
Распаковка происходит аналогично, но нужно указать тот же формат, который использовался при запаковке. Результат возвращается всегда в виде кортежа.
>>> struct.unpack('=fiQ', data)
(1.0, 4, 100500)
Как видите, ничего страшного!
#lib#basic
#kotlin
Google AI Edge Gallery lets you run powerful open-source AI models like Gemma 4 on your phone offline, with features like smart agents, image analysis, voice transcription, and a prompt tester. It keeps everything private on your device for fast, secure use without internet. Download from Google Play or App Store to test advanced AI reasoning and creativity anytime, boosting your productivity and privacy on the go.
https://github.com/google-ai-edge/gallery
🏝Kotlin 2.3.0 Stable! Вышла новая версия языка
Команда Kotlin выпустила финальную версию Kotlin 2.3.0. Обновление приносит новые стабильные возможности языка, улучшения производительности и поддержку новейших инструментов.
📢 Основные нововведения:
✅ Язык: Больше стабильных функций, проверка неиспользуемых возвращаемых значений, явные backing field.
✅ Kotlin/JVM: Поддержка Java 25.
✅ Kotlin/Native: Улучшенный Swift export, ускорение сборки, импорт C/Objective-C библиотек (бета).
✅ Kotlin/Wasm: Полные имена и новая модель исключений включены по умолчанию.
✅ Kotlin/JS: Экспериментальный export suspend-функций, новое представление LongArray.
✅ Gradle: Совместимость с Gradle 9.0, новый API для регистрации сгенерированных исходников.
✅ Compose compiler: Стектрейсы для минифицированных Android-приложений.
✅ Стандартная библиотека: Стабильные API для работы со временем и улучшенная работа с UUID.
📖 Подробнее на сайте
Каждую ключевую фичу подробно разберу в отдельном посте в канале @kotlin_broadcast. Следите за новостями!
#Kotlin
🏝Приоритеты поддержки таргетов JetBrains и Google выбирают на основе тиров. Особенно зоопарк в Kotlin/Native таргета (их суммарно 21 на момент написани поста). Все они поделены на три тира по важности. Tier 1 - самый важный и работы ведутся в первую очередь, а вот Tier 3 - самый низкоприоритетный и неинтересный. Там находятся все Android Native тарегты, mingwX64 и watchosDeviceArm64.
Именно по этой причине Google не фокусируется на этих таргетах, хотя mingwX64 не обходит стороной.
#kotlin
🏝Вышел Kotlin 2.2.0
Что нового в релизе языка:
👉 Превью context parametr
👉 Non-local break и continue теперь stable
👉 Kotlin/JVM: изменения в генерации метода по умолчанию
👉 Kotlin/Native: улучшения в управлением памятью
👉 Kotlin/Wasm: wasmJs таргет отделили от js таргета
🐘 Поддержка Gradle 7.6.3 - 8.14
👉 Base64 стало Stable
#kotlin
🏝9 лет назад вышла первая версия Kotlin 🎉🎉🎉
Кажется, я совсем недавно еще работал с бета-версиями первой версии Kotlin, писал приложения с расписанием для университета, где учился, чтобы попробовать эту технологию. Тогда была только поддержка JVM и проводились эксперименты с JS.
Сегодня Kotlin - это уже целая экосистема💪, которая позволяет писать приложения для нескольких платформ, имеет огромное сообщество разработчиков, а также официальную поддержку от команды 🤖 Android в Google. А как хорош Compose Multiplatform ❤️❤️❤️
Уже появилось поколение разработчиков, которые начали свой путь именно с Kotlin для разработки под Android 🤯🤯🤯
Поделитесь в комментариях под постом в @kotlin_broadcast своей историей знакомства с этим языком и тем, что вас привлекло в нем.
#kotlin
🏝Kotlin where: Элегантное ограничение типов для чистоты и безопасности
Как часто в Android-разработке вы видели сомнительные as-приведения? 🤔
Вот пример, который недавно попался мне на глаза:
class Sample(private val activity: Activity) {
fun doSomething() {
// Опасно! Может упасть с ClassCastException,
// если activity не реализует LifecycleOwner
(activity as LifecycleOwner).lifecycle.addObserver(...)
}
}
Опустим тот факт, что здесь стоит использовать слабую ссылку (WeakReference) на Activity. Меня больше смутила необходимость вручную приводить Activity к LifecycleOwner.
Да, в современной Android-разработке AppCompatActivity и FragmentActivity реализуют этот интерфейс. Но наша цель — писать чистый и стабильный код, который не полагается на слепую веру, а гарантирует безопасность на уровне типов.
💡Решение: Ограничение типов с помощью where
В Kotlin мы можем использовать условие where для универсальных параметров, чтобы указать: «класс A должен быть одновременно и Activity, и LifecycleOwner
class Sample<A>(private val activity: A)
where A : Activity,
A : LifecycleOwner {
fun doSomething() {
// Теперь activity можно использовать как LifecycleOwner
// БЕЗОПАСНО и без приведения типов
activity.lifecycle.addObserver(...)
}
}
Этот же подход отлично работает и для функций:
fun <A> doSomethingWith(activity: A)
where A : Activity,
A : LifecycleOwner {
// Полная типобезопасность
activity.lifecycle.addObserver(...)
}
В чем выигрыш?
Безопасность: Компилятор гарантирует, что в класс Sample или функцию doSomethingWith можно передать только объект, который удовлетворяет обоим условиям:
1️⃣Исключаются ошибки ClassCastException в рантайме.
2️⃣Чистота кода: Исчезают громоздкие и опасные приведения через as.
3️⃣Выразительность: Сигнатура класса/функции явно сообщает о своих требованиях к переданным зависимостям.
Используйте силу системы типов Kotlin на полную! Это делает код не только чище, но и стабильнее. 💪
#kotlin#android#androiddev
🔥Вышел JUnit 6 с поддержкой Kotlin
Прошло более 8 лет с релиза JUnit 5 (10 сентября 2017 года) и вот новая мажорная версия популярного фреймворка для написания Unit тестов в Java
Ключевые изменения в новой версии:
👉 Поддержка Java 17 и Kotlin 2.2+
👉 Переход на аннотации JSpecify
🏝 Поддержка корутин из Kotlin
👉 Поддержка Java Flight Recorder (JFR) из коробки
👉 Поддержка отмены выполнения теста
👉 Удалено deprecated API
👉--fail-fast режим для запуска тестов из терминала
#тестирование#kotlin