uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi 👉 Belgini ko‘rmoqchi bo‘lsangiz, obuna bo‘ling

Zen of Python

Zen of Python

Kanalga Telegram’da o‘tish

Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL

Ko'proq ko'rsatish

📈 Telegram kanali Zen of Python analitikasi

Zen of Python (@zen_of_python) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 18 613 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 030-o'rinni va Rossiya mintaqasida 35 241-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 18 613 obunachiga ega bo‘ldi.

14 Noyabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -161 ga, so‘nggi 24 soatda esa 2 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 7.25% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 4.20% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 1 349 marta ko‘riladi; birinchi sutkada odatda 782 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 2 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent github, rust, pip, api, install kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL”

Yuqori yangilanish chastotasi (oxirgi ma’lumot 15 Noyabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

18 613
Obunachilar
+224 soatlar
-447 kun
-16130 kun
Obunachilarni jalb qilish
Noy '26
Noyabr '26
+20
1 kanalda
Oktabr '26
+75
0 kanalda
Get PRO
Sentabr '26
+89
5 kanalda
Get PRO
Avgust '26
+62
5 kanalda
Get PRO
Iyul '26
+46
5 kanalda
Get PRO
Iyun '26
+120
2 kanalda
Get PRO
May '26
+124
0 kanalda
Get PRO
Aprel '26
+84
1 kanalda
Get PRO
Mart '26
+74
3 kanalda
Get PRO
Fevral '26
+75
9 kanalda
Get PRO
Yanvar '26
+136
1 kanalda
Get PRO
Dekabr '25
+140
5 kanalda
Get PRO
Noyabr '25
+158
5 kanalda
Get PRO
Oktabr '25
+258
7 kanalda
Get PRO
Sentabr '25
+143
1 kanalda
Get PRO
Avgust '25
+180
3 kanalda
Get PRO
Iyul '25
+248
4 kanalda
Get PRO
Iyun '25
+208
6 kanalda
Get PRO
May '25
+214
4 kanalda
Get PRO
Aprel '25
+189
2 kanalda
Get PRO
Mart '25
+175
6 kanalda
Get PRO
Fevral '25
+134
5 kanalda
Get PRO
Yanvar '25
+89
3 kanalda
Get PRO
Dekabr '24
+92
1 kanalda
Get PRO
Noyabr '24
+137
6 kanalda
Get PRO
Oktabr '24
+95
4 kanalda
Get PRO
Sentabr '24
+102
3 kanalda
Get PRO
Avgust '24
+98
1 kanalda
Get PRO
Iyul '24
+82
3 kanalda
Get PRO
Iyun '24
+67
1 kanalda
Get PRO
May '24
+95
0 kanalda
Get PRO
Aprel '24
+148
0 kanalda
Get PRO
Mart '24
+107
1 kanalda
Get PRO
Fevral '24
+116
4 kanalda
Get PRO
Yanvar '24
+109
1 kanalda
Get PRO
Dekabr '23
+123
6 kanalda
Get PRO
Noyabr '23
+103
2 kanalda
Get PRO
Oktabr '23
+140
5 kanalda
Get PRO
Sentabr '23
+91
0 kanalda
Get PRO
Avgust '23
+218
0 kanalda
Get PRO
Iyul '23
+211
0 kanalda
Get PRO
Iyun '23
+159
0 kanalda
Get PRO
May '23
+292
0 kanalda
Get PRO
Aprel '23
+193
0 kanalda
Get PRO
Mart '23
+194
0 kanalda
Get PRO
Fevral '23
+316
0 kanalda
Get PRO
Yanvar '23
+424
0 kanalda
Get PRO
Dekabr '22
+522
0 kanalda
Get PRO
Noyabr '22
+454
0 kanalda
Get PRO
Oktabr '22
+257
0 kanalda
Get PRO
Sentabr '22
+638
0 kanalda
Get PRO
Avgust '22
+750
0 kanalda
Get PRO
Iyul '22
+745
0 kanalda
Get PRO
Iyun '22
+1 008
0 kanalda
Get PRO
May '22
+622
0 kanalda
Get PRO
Aprel '22
+1 260
0 kanalda
Get PRO
Mart '22
+975
0 kanalda
Get PRO
Fevral '22
+1 947
0 kanalda
Get PRO
Yanvar '22
+597
0 kanalda
Get PRO
Dekabr '21
+203
0 kanalda
Get PRO
Noyabr '21
+1 278
0 kanalda
Get PRO
Oktabr '21
+2 258
0 kanalda
Get PRO
Sentabr '21
+376
0 kanalda
Get PRO
Avgust '21
+766
0 kanalda
Get PRO
Iyul '21
+1 065
0 kanalda
Get PRO
Iyun '21
+737
0 kanalda
Get PRO
May '21
+132
0 kanalda
Get PRO
Aprel '21
+2 962
0 kanalda
Get PRO
Mart '21
+1 825
0 kanalda
Get PRO
Fevral '21
+613
0 kanalda
Get PRO
Yanvar '21
+3 216
0 kanalda
Get PRO
Dekabr '20
+7 337
0 kanalda
Sana
Obunachilarni jalb qilish
Esdaliklar
Kanallar
15 Noyabr+1
14 Noyabr+4
13 Noyabr+1
12 Noyabr+1
11 Noyabr0
10 Noyabr+2
09 Noyabr+1
08 Noyabr0
07 Noyabr0
06 Noyabr+3
05 Noyabr+1
04 Noyabr+3
03 Noyabr0
02 Noyabr+2
01 Noyabr+1
Kanal postlari
os.cpu_count() может считать больше, чем доступно потоку Число логических CPU в системе и число CPU, на которых разрешено раб
os.cpu_count() может считать больше, чем доступно потоку Число логических CPU в системе и число CPU, на которых разрешено работать текущему потоку, могут различаться. Начиная с Python 3.13, os.process_cpu_count() возвращает второе. По документации Python, оно может быть меньше os.cpu_count() из-за CPU affinity. Если определить число не удалось, результатом будет None. Есть важная поправка для диагностики: параметр запуска -X cpu_count=n или переменная PYTHON_CPU_COUNT переопределяет результат обеих функций. В отдельном проверенном процессе с -X cpu_count=2 обе вернули 2. Это заданная настройка, а не измерение оборудования или демонстрация ограничения affinity. Проверяйте конфигурацию запуска, прежде чем выбирать размер пула по этому числу. API не считает физические ядра и не обещает универсально определять квоты cgroup. Оптимальное число воркеров всё ещё зависит от вашей нагрузки.

2
Почему batch_size не ограничивает всю подготовку bulk_update В bulk_update(objects, fields, batch_size=100) размер пачки огра
Почему batch_size не ограничивает всю подготовку bulk_update В bulk_update(objects, fields, batch_size=100) размер пачки ограничивает число объектов в одном SQL-запросе. Но Django заранее готовит WHEN-выражения для всех переданных объектов, включая следующие пачки. Маленький batch_size не делает один большой вызов потоковым. В документации Django 6.0 предлагают внешний цикл: взять порцию ID через islice, загрузить только её модели, изменить поля и вызвать bulk_update() для этой порции. В проверенном примере шесть строк обновились за три отдельных вызова по две модели. Внутри каждого batch_size=1 дал два UPDATE-запроса. Это два разных уровня разбиения. Если заранее собрать все модели в список, внешний цикл не вернёт уже занятую ими память. И массовое обновление не вызывает save() и сигналы pre_save/post_save. Учитывайте это, если там находится нужная вам логика.
673
3
Process.interrupt() даёт дочернему процессу KeyboardInterrupt В Python 3.14 у multiprocessing.Process появился interrupt(). Н
Process.interrupt() даёт дочернему процессу KeyboardInterrupt В Python 3.14 у multiprocessing.Process появился interrupt(). На POSIX он посылает дочернему процессу SIGINT. При стандартном обработчике в нём возникает KeyboardInterrupt, а стек Python разворачивается с выполнением блоков finally. В нашем проверенном примере родитель дождался готовности собственного дочернего процесса, вызвал interrupt() и сделал join(3). Дочерний процесс оставил файл из finally и завершился с exitcode == 1, как при неперехваченном исключении. У terminate() такой гарантии выполнения finally нет. Это не гарантия остановки: второй тестовый процесс перехватил KeyboardInterrupt и продолжил работать до отдельного разрешения на выход. Обработчик сигнала тоже может изменить поведение. После ожидания проверяйте is_alive(). На Windows поведение метода не определено — это ограничение прямо указано в документации interrupt.
679
4
PEP 639 разделяет лицензию и файлы с её текстом В метаданных пакета нужно различать обозначение лицензии и файлы с юридически
PEP 639 разделяет лицензию и файлы с её текстом В метаданных пакета нужно различать обозначение лицензии и файлы с юридическими текстами. Финальная спецификация PEP 639 вводит для Core Metadata 2.4 поле License-Expression с выражением SPDX и отдельные поля License-File. В pyproject.toml строка license = "MIT" задаёт выражение, а license-files = ["LICENSE"] указывает файлы для включения в дистрибутив. Это пример записи, а не выбор лицензии за автора. Каждый явно заданный шаблон должен найти хотя бы один файл. Старые таблицы license = {text = ...} и {file = ...} объявлены устаревшими. Карточка показывает схему спецификации. Мы проверили разбор TOML и наличие файла в учебной папке, но это не проверка поддержки сборочным backend. В своём пакете проверьте метаданные и файлы уже собранных wheel и sdist. Выражение SPDX не заменяет лицензионные тексты и само по себе не предоставляет новых прав.
820
5
Как закрыть asyncio.Queue без стоп-сигнала в данных В Python 3.13 у asyncio.Queue появился shutdown(). После вызова очередь б
Как закрыть asyncio.Queue без стоп-сигнала в данных В Python 3.13 у asyncio.Queue появился shutdown(). После вызова очередь больше не принимает элементы: новые и уже ожидающие put() получают QueueShutDown. Для завершения конвейера не нужен специальный объект, который потребители должны отличать от обычных данных. При обычном завершении оставшиеся элементы можно забрать через get(). Когда очередь опустеет, он тоже вызовет QueueShutDown — потребитель может перехватить исключение и выйти. Для каждого обработанного элемента по-прежнему нужен task_done(), чтобы дождаться join(). Завершения самих задач потребителей ждите отдельно. Режим immediate=True отбрасывает лежащие в очереди элементы. Уже взятая работа остаётся незавершённой: в проверенном примере join() ждал её task_done(). Возврат из него не доказывает, что отброшенные элементы обработаны. Различия режимов описаны в документации shutdown.
870
6
Placeholder оставляет место перед связанным аргументом У str.replace исходная строка стоит перед заменяемым фрагментом. Если
Placeholder оставляет место перед связанным аргументом У str.replace исходная строка стоит перед заменяемым фрагментом. Если нужен колбэк, удаляющий дефисы из любой строки, хотелось бы заранее задать второй и третий позиционные аргументы, оставив первый свободным. В Python 3.14 это делает functools.Placeholder. Импортируйте его как _ и создайте partial(str.replace, _, "-", ""). При вызове strip_dash("a-b-c") строка займёт пропуск, и получится "abc". Раньше partial тоже связывал аргументы по имени, но позиционные пропуски позволяют фиксировать аргументы после свободного места, включая параметры, которые нельзя передать по имени. Если пропусков несколько, входящие позиционные аргументы заполняют их слева направо. Все пропуски нужно заполнить при вызове, иначе будет TypeError. Передать сам Placeholder как именованный аргумент в partial нельзя.
926
7
Как узнать, какие тесты выполняли строку кода Зелёная строка в coverage-отчёте показывает, что код выполнялся. Чтобы увидеть,
Как узнать, какие тесты выполняли строку кода Зелёная строка в coverage-отчёте показывает, что код выполнялся. Чтобы увидеть, в каких тестах это происходило, у pytest-cov есть --cov-context=test. Он сохраняет ID теста и фазу выполнения: setup, run или teardown. Запустите pytest --cov=calc --cov-context=test --cov-report=html, заменив calc именем своего модуля. В .coveragerc включите [html] show_contexts = True. В нашем запуске coverage 7.17.2 на CPython 3.14.4 понадобился ещё [run] core = ctrace: стандартный sysmon предупреждал о неполных контекстах. По документации pytest-cov, нажатие на число у покрытой строки раскрывает список контекстов. У параметризованных случаев будут разные test ID, включая заданные вами имена. В проверенном примере два случая neg и pos дали шесть контекстов у одной строки: её вызывали в каждой из трёх фаз. Число контекстов не равно числу тестов. И такой отчёт показывает выполнение кода, а не качество проверок результата.
890
8
Как читать BLOB из SQLite по частям Если вложение хранится в SQLite, не обязательно получать его целиком как один bytes. Начи
Как читать BLOB из SQLite по частям Если вложение хранится в SQLite, не обязательно получать его целиком как один bytes. Начиная с Python 3.11, Connection.blobopen() открывает существующий BLOB по имени таблицы, столбца и rowid. У полученного объекта есть файловые операции чтения и записи. Размер задаётся заранее: zeroblob(8) создаёт восемь нулевых байтов, которые затем можно перезаписать частями. На карточке — фрагмент проверенного примера: после двух записей по четыре байта чтение с read(4) выдаёт два блока. Для большого объекта выбирайте подходящий размер блока и обрабатывайте каждый сразу, не собирая их обратно в список. Без аргумента read() прочитает весь остаток до конца. Сам BLOB через этот интерфейс увеличить нельзя, а таблицы WITHOUT ROWID не поддерживаются. Контекстный менеджер закрывает BLOB-дескриптор. Детали — в описании Blob.
948
9
pytest --sw возвращает к последнему упавшему тесту После правки несколько тестов падают подряд. Если исправляете их по одному
pytest --sw возвращает к последнему упавшему тесту После правки несколько тестов падают подряд. Если исправляете их по одному, pytest --sw помогает не прогонять уже пройденное начало набора при каждой попытке. Он останавливается на первом падении и сохраняет позицию между запусками. Следующий запуск с --sw начинает с того же упавшего теста. Если вы его починили, pytest идёт дальше до следующей ошибки. В нашем проверенном примере первый прогон остановился на test_b, а после исправления второй повторил test_b и дошёл до падения test_c. Это отличается от --lf, который выбирает ранее упавшие тесты. Механизм описан в документации pytest. Позиция хранится в кэше, а не в памяти остановленного процесса. Ранние успешные тесты после ваших правок могли сломаться. Когда закончите исправления, запустите весь набор обычным pytest.
1 006
10
ZIP с Zstandard может не открыться у получателя Архив успешно собрался и распаковался вашим Python, но это ещё не проверка со
ZIP с Zstandard может не открыться у получателя Архив успешно собрался и распаковался вашим Python, но это ещё не проверка совместимости с утилитой получателя. Для ZIP с Zstandard важны и поддержка алгоритма, и его числовой идентификатор в архиве. В Python 3.14 появился zipfile.ZIP_ZSTANDARD. По документации zipfile, модуль читает Zstandard с ID 20 и 93, а записывает только 93. Старый ID 20 заменили в спецификации, чтение сохранили ради совместимости. Локальный пример на CPython 3.14.4 подтвердил запись 93 и восстановление исходных байтов. Нужна сборка Python с необязательным модулем compression.zstd. Если архив уйдёт за пределы вашей среды, проверьте распаковку именно инструментом получателя: часть утилит, включая старые версии Python, Zstandard в ZIP не поддерживает.
1 020
11
Как посмотреть локальные переменные после ошибки в REPL Вызов в интерактивном Python завершился исключением, а по traceback н
Как посмотреть локальные переменные после ошибки в REPL Вызов в интерактивном Python завершился исключением, а по traceback непонятно, какое значение привело к ошибке. Пока эта сессия открыта, можно посмотреть локальные переменные в месте ошибки без повторного запуска вызова. Импортируйте pdb и выполните pdb.pm(). Функция берёт последнее необработанное исключение из sys.last_exc и открывает отладчик на кадре, где оно возникло. Команда p x покажет значение x в этом кадре. На карточке — выполненный пример: после f(0) виден локальный x = 0. Такой сценарий есть и в документации pdb. Это просмотр сохранённого traceback в том же живом REPL. Продолжить исходный вызов, завершившийся исключением, нельзя. После выхода из интерпретатора этот приём уже не поможет.
1 018
12
abi3t сокращает число сборок нативного расширения Нативному расширению обычно нужны отдельные сборки под версии CPython, а fr
abi3t сокращает число сборок нативного расширения Нативному расширению обычно нужны отдельные сборки под версии CPython, а free-threaded варианты ещё увеличивают их число. Начиная с CPython 3.15, Stable ABI для free threading, или abi3t, позволяет одной сборке на платформу поддерживать несколько версий. Она совместима и с обычными сборками CPython 3.15+. Для этого придётся ограничиться доступной частью C API и, возможно, пожертвовать скоростью. Руководство рекомендует сначала подготовить расширение к free threading. Если оно использует генератор кода или биндинги, стоит дождаться поддержки abi3t в соответствующем инструменте. Расширения с собственными типами переменного размера нельзя перенести на abi3t 3.15. А совместимость ABI не исключает изменений поведения между версиями: тесты нужно запускать на каждой поддерживаемой версии, в обычной и free-threaded сборках Python.
1 058
13
Установщик Python 3.15 для macOS ставит обе сборки по умолчанию В установщике Python 3.15 с python.org для macOS free-threade
Установщик Python 3.15 для macOS ставит обе сборки по умолчанию В установщике Python 3.15 с python.org для macOS free-threaded сборка отмечена по умолчанию. Она ставится рядом с обычной, в отдельный PythonT.framework, и запускается командой python3.15t. Отключить этот компонент можно через Customize. У сборок отдельные каталоги site-packages и собственные экземпляры pip. Наличие пакета в обычном Python поэтому не означает, что он установлен и во free-threaded варианте. В инструкции для macOS рекомендуют использовать виртуальные окружения, чтобы не путать интерпретаторы. Эта настройка относится к официальному установщику, а не ко всем дистрибутивам Python для Mac. Нативные расширения могут ещё не поддерживать работу без GIL и включать его обратно. Перед запуском приложения во второй сборке проверьте совместимость его зависимостей.
1 110
14
Unicode-идентификатор начинается и продолжается по разным правилам Если вы пишете токенизатор или подсветку для языка с Unicode-именами, проверки «это буква или цифра» может оказаться недостаточно. У Unicode есть отдельные свойства для начальной и последующих позиций идентификатора. В Python 3.15 эти проверки добавили в unicodedata. Функция isxidstart проверяет свойство XID_Start, а isxidcontinue — XID_Continue по UAX #31. Каждая принимает один символ. Модуль использует базу Unicode 17.0.0. Так можно проверять свойства символов без собственного списка диапазонов, который придётся обновлять вместе с Unicode. Для проверки целого имени нужны ещё правила конкретного языка. Например, эти функции не проверяют, является ли имя зарезервированным словом.
1 218
15
Обновление Python не обновляет pip в старых venv В Python 3.15.1 обновили комплектный pip до 26.2.2. В его состав входит certifi 2026.10.19 с изменениями после инцидента с центрами сертификации eMudhra / emSign. Но установка нового интерпретатора сама по себе не обновляет инструменты внутри уже созданных виртуальных окружений. На странице релиза отдельно просят обновить pip и uv в существующих venv до последних версий. Там же приведены ссылка на wheel pip с SHA-256 и отдельная инструкция по обновлению сертификатов для установки на macOS. Проверяйте версию pip внутри нужного окружения. Версия системного Python этого не показывает. Для обновления сертификатов выбирайте инструкции релиза, относящиеся к вашему способу установки.
1 248
16
Стартовый код пакета переезжает из .pth в .start Файл .pth может не только расширять sys.path. При запуске Python модуль site
Стартовый код пакета переезжает из .pth в .start Файл .pth может не только расширять sys.path. При запуске Python модуль site исполняет найденные в нём строки, начинающиеся с import. Этот код выполняется ещё до первой строки приложения. В Python 3.15 PEP 829 вводит файлы .start с явными точками входа в форме pkg.mod:callable. Функция вызывается без аргументов, возвращённое значение отбрасывается. У PEP статус Final. Если рядом есть одноимённый .start, строки import из соответствующего .pth игнорируются. Добавление путей из .pth сохраняется. Это позволяет переносить стартовую инициализацию отдельно от настройки путей, сохраняя старый файл для прежних интерпретаторов.
1 230
17
Decimal в тайм-ауте не делает ожидание точнее Тайм-аут может прийти в программу как Decimal из конфигурации или как Fraction после вычисления. В Python 3.15 функции с аргументами timestamp и timeout принимают любые вещественные числа, а не только int и float. В описании изменения отдельно оговорено: точность от этого не повышается. Изменение позволяет передавать уже вычисленное значение без преобразования на стороне вызывающего кода. Что именно ограничивает тайм-аут и когда функция возвращает управление, по-прежнему зависит от её контракта. Допустимый числовой тип этих правил не меняет.
1 224
18
wxPython 4.3.2 добавил wheels для Python 3.15 и проверку типов обработчиков Bind При переходе Python-приложения с нативным GUI на новый интерпретатор нужны и подходящие бинарные сборки GUI-библиотеки. В wxPython 4.3.2 заявлены официальная поддержка Python 3.15 и сборка wheels для него. Релиз использует wxWidgets 3.3.4. Выпуск Windows wheels для 32-битной архитектуры прекращён. Сгенерированные .pyi теперь позволяют проверять типы обработчиков, передаваемых в Bind. Среди других правок в stubs — представление enum в виде классов и более полное описание методов и типов. Типизатор сможет найти часть ошибок при подключении событий до запуска окна. Работу виджетов в вашей ОС нужно проверять отдельно. Перед миграцией проверьте наличие подходящего wheel и поведение GUI на целевой платформе.
1 287
19
Фильтры предупреждений в CLI научились понимать регулярки В CI бывает нужно превратить в ошибку конкретное семейство предупре
Фильтры предупреждений в CLI научились понимать регулярки В CI бывает нужно превратить в ошибку конкретное семейство предупреждений и оставить остальные видимыми. Настройку для дочернего процесса удобно передать через -W или PYTHONWARNINGS, без правок приложения. Начиная с Python 3.15 поля сообщения и модуля поддерживают регулярные выражения, если поле начинается и заканчивается косой чертой. Без этих разделителей сохраняется буквальное сопоставление. Это дополнение к синтаксису фильтра, его действия и категории остаются прежними. У полей разные правила. Сообщение сопоставляется с начала без учёта регистра. Имя модуля учитывает регистр: буквальная строка должна совпасть целиком, а регулярное выражение проверяет начало полного имени. Поэтому одинаковый шаблон в этих двух полях может охватить разные предупреждения.
1 260
20
Одинаковое имя XMP-тега ещё не означает одно поле В метаданных изображения могут встретиться XML-теги с одинаковым локальным
Одинаковое имя XMP-тега ещё не означает одно поле В метаданных изображения могут встретиться XML-теги с одинаковым локальным именем из разных пространств имён. Если убрать URI пространства, различить такие свойства по одному имени уже не получится. В Pillow 13.0.0 метод Image.getxmp получил аргумент strip_namespaces. По умолчанию он равен True, и библиотека по-прежнему убирает URI. Значение False сохраняет полное имя тега в форме {namespace-uri}local-name. Если вам нужно различать свойства из разных пространств имён, выбирайте False и учитывайте полные ключи при чтении результата. Опция меняет только представление имён XMP-тегов.
1 203