TGTGInsighttelegram intelligenceLIVE / telegram public index
Назад кон каналите
Python Заметки avatar

TGINSIGHT CHAT

Python Заметки

@pythonotes

Education

Интересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop

Претплатници2,220Тековни претплатници
Следени објави384Број на индексирани објави
Неодамнешен опфат9,914Збир на неодамнешни прегледи
Неодамнешни објави

Неодамнешни објави

Страница 22 од 32 · 384 објави

Објавено 14 сеп.

Типы файлов, которые может прочитать Python используя только стандартные библиотеки. Сделал подборку модулей из стандартной библиотеки для чтения/записи различных типов файлов. В данную подборку не вошли такие модули как pickle или zipapp, так как это форматы внутренней кухни Python. Рассматриваем только внешние форматы. ——————————— Module:aifc Type: aiff, aifc Details:Audio Interchange File Format Этот тип аудио файлов используется для записи звука в высоком качестве. Файл AIFC представляет собой сжатую версию формата AIFF. Module: binhex Type: hqx (BinHex4) Details: Кодирование бинарных файлов в шестнадцатеричный текстовый формат и обратно (Binary-to-hexadecimal). Module: bz2 Type: bzip2 Details: Архивация по алгоритму bzip2 Module: chunk Type: aiff/aiff-c, rmff Details: Audio Interchange File Format, Real Media File Format Module: html Type: html Details: Утилиты для работы с форматом HTML Module: json Type: json Details: Поддержка формата JSON. Module: lzma Type: xz, lzma Details: Архивация данных с алгоритмом LZMA и поддержка старого формата XZ Module: msilib Type: msi Details: Создание файлов типа Microsoft Installer, инсталляторы для Windows. Module: sqlite3 Type: sqlite Details: Интерфейс для работы с реляционной базой данных SQLite Module: sunau Type: au Details: Интерфейс для взаимодействия с аудио файлами SunAU Module: tarfile Type: tar Details: Чтение и запись файловых контейнеров в формате TAR, с поддержкой сжатия gzip, bz2 и lzma. Module: wave Type: wav Details: Чтение и запись аудио файлов без сжатия формата WAV. Module: xml Type: xml Details: Интерфейс для манипуляций с текстовым форматом XML. Module: zipfile Type: zip Details: Чтение и запись архивов ZIP. Module: zlib Type: gz Details: Чтение и запись архивов GZ с помощью библиотеки zlib Module: csv Type: csv Details: Comma Separated Values, формат для записи табличных данных. Module: configparser Type: ini Details: Чтение и запись формата конфигов Microsoft Windows INI file Module: netrc Type: netrc Details: Парсинг файлов netrc для хранения данных аутентификации пользователей. ——————————— Надеюсь, кому-то данная информация поможет не изобретать велосипеды))) Напоминаю, что в список попали только стандартные библиотеки которые идут в поставке с Python. #libs

1,250 views

Hashtags

Објавено 11 сеп.

Как создать новый тип объекта? Очень просто! Cоздайте новый класс. class MyType: pass Такой способ подходит для создания класса, статично записанного в скрипт. Но бывают случаи когда мы заранее не знаем какие атрибуты и методы будут у класса. То есть требуется динамическое создание класса во время исполнения кода. Для чего? Самое очевидное использование это Mock-объекты. Когда нам нужно подменить оригинальный объект заглушкой. Регулярно используется в авто тестах и в генераторах документации. Есть даже специальный класс для этого unittest.mock.Mock. Можем на лету создавать класс и настраивать его поведение. >>> from unittest.mock import Mock >>> dyn_obj = Mock() >>> dyn_obj.return_value = 123 >>> print(dyn_obj()) 123 Также можно создать инлайн тип с помощью функции type(). MyType = type("MyType", (object,), {"func": lambda: 123, "attr": 321}) Первый аргумент это имя нового объекта. Второй аргумент это список родительских классов. Третий, это неймспейс объекта, то есть его методы и атрибуты. В неймспейсе можно указывать как просто данные так и функции. Однажды, для совместимости со старым кодом потребовалось немного изменить имеющийся класс. Был переименован метод и нужно было временно сделать заглушку. Писать отдельный класс не хотелось, а нужен был именно класс а не инстанс, к тому же не надолго. Вот тут и пригодился данный трик. # старый класс class OldClass: def old_method(self): return 123 # вариант с переопределением старого класса class OldClass(OldClass): def new_method(self): return self.old_method() # тоже самое но с динамически созданным типом непосредственно в том месте где он требуется OldClass = type('NewClass', (OldClass,), {'new_method': lambda self: self.old_method()}) >>> obj = OldClass() >>> print (obj.new_method(), obj.old_method()) (123, 123) Пример из практики #1 Был случай, когда я написал собственную реализацию запросов на сервер. Некий аналог requests, но очень простой, на чистых сокетах. Это требовалось потому, что в исполняемой среде была версия Python, в которой никак не хотел работать оригинальный requests, да и слишком тяжёлый он был. При этом интерфейс ответа требовалось сохранить как в requests, но не всегда а по запросу, то есть динамически. Пример из практики #2 Для некоторых, не совсем логичных, но всё же целей, требовалось воссоздавать типы, которые прилетели в виде JSON-данных. Структура типа и данные инстанса были в этом JSON. Оставалось только пересобрать класс и создать инстанс. Некое подобие pickle, только немного иначе. Но это уже достаточно сложные примеры для поста. Пожалуй, код опустим)))😊 #tricks

1,060 views

Hashtags

Објавено 9 сеп.

Функция round() может округлять не только дробную часть но и целую. Для этого нужно использовать отрицательное значение. >>> round(12345.6789, 2) 12345.68 >>> round(12345.6789, -2) 12300.0 #tricks

794 views

Hashtags

Објавено 7 сеп.

Посмотрите на эту функцию def my_func(): x = 1 y = 2 ... return x+y Если я запущу её в таком виде, какую ошибку получу? Похоже на пример из урока. Скорее всего будет SyntaxError из-за троеточия (...). Но если вы выполните этот код... ОШИБКИ НЕ БУДЕТ😳! Почему❓ Всё дело в том что троеточие это одна из стандартных констант в Python, называется Ellipsis. Такая же как None, True или False. Это не какой-то тип данных, для него нет каких-либо специальных операторов. Нигде в стандартной библиотеке он не используется. Хотя, может в распечатке объектов с бесконечной рекурсией (но это не точно). >>> x = [] >>> x.append(x) >>> print(x) [[...]] Так где же применять эту штуку? Прежде всего, стоит заметить что этот объект кажется достаточно неуместным для Python. Ведь Python такой логичный и минималистичный и тут вдруг бесполезная константа которая нигде не встречается! Но всё же давайте посмотрим как эта константа может быть использована. 🔸Особый синтаксис срезов В документации написано что Ellipsis используется для "extended slicing syntax". Это значит что он используется в слайсинге, но не в стандартном. Его можно применить в расширенном слайсинге, то есть когда переопределяете метод __getitem__ в ваших классах. >>> class C(object): >>> def __getitem__(self, item): >>> return item Если вы попробуем получить нечто по индексу то в item прилетает этот индекс >>> C()[1] 1 Но если передать в квадратные скобки несколько аргументов, то в item прилетает кортеж >>> C()[1, 10] (1, 10) Вам остаётся решить как обработать такие аргументы и вернуть "срез" вашего типа. Ну и ничто не мешает нам использовать (...) в качестве "синтаксического сахара" для реализации какой-то особой логики. >>> C()[1, ..., 10] (1, Ellipsis, 10) >>> C()[3:...] slice(3, Ellipsis, None) Вам остаётся лишь решить как именно обработать такой запрос. Например так: >>> class C(object): >>> def __getitem__(self, item): >>> if item is Ellipsis: >>> return "RETURN ALL" >>> return "RETURN BY INDEX" >>> C()[...] RETURN ALL Именно так сделано в numpy 🔸Аналог для pass Сравните две записи def some_func(): pass def some_func(): ... По-моему, вторая запись более ясно говорит, что здесь что-то имеется в виду и это надо дописать 😉. Но, несмотря на то, что Ellipsis был доступен еще с древних версий 2.Х, такая запись сработает только в Python3. Для 2го троеточие доступно только в квадратных скобках. 🔸Заглушка для значений по умолчанию def func(x=...): ... Альтернатива None? Совсем уж сомнительно 😖, но работает как визуальный триггер для разработчика) Всё, больше идей пока нет) На последок вот такая странная фиговина. Что покажет этот print() ??? #tricks

802 views

Hashtags

Објавено 4 сеп.

Существуют фреймворки для создания десктоп приложений на базе WebGUI (HTML+CSS+JS). Например Electron, NW.js и другие. Вся логика у них пишется на JavaScript. Если хотите писать такие приложения с логикой на Python, то для вас есть аналог, это библиотека Eel. 🔸 Создавайте десктоп-GUI из HTML страниц со всем доступным для них функционалом. 🔸 Вызывайте Python-функции из JavaScript. 🔸 Вызывайте JavaScript функции из Python. 🔸 Есть встроенный сборщик приложения в Standalone через PyInstaller. Eel запускает сервер и создаёт минималистичный chromium-браузер, который работает с этим сервером. (Вы также можете открыть GUI вашего приложения и в обычном браузере, пока само приложение запущено) Я за полчаса собрал нехитрое приложение, выполняющее Python-код введённый в HTML форме. 🌎https://github.com/paulwinex/eel-webform-example Для десктоп приложений идеально подойдет концепция SPA(Single Page App). Мой элементарный пример на Vue.js 🌎https://github.com/paulwinex/eel-vuejs-example ➡️На почитать #libs

803 views

Hashtags

Објавено 2 сеп.

Интересная библиотека tqdm, добавляющая прогресс бар для вашей итерации в CLI скриптах. Что показывает прогресс бар? - прогресс в процентах - прогресс в количестве итераций - потраченное и оставшееся время выполнения - скорость выполнения в итерациях в секунду Использовать очень просто, оберните итератор в tqdm и получите прогресс обработки! from tqdm import tqdm for i in tqdm(iterable_obj): # do something Всё сломается если внутри цикла есть какая-либо печать в stdout #libs

758 views

Hashtags

Објавено 31 авг.

Роняем Python в одну строку Как имитировать ошибку Segmentation Fault в коде и уронить процесс интерпретатора? 🔸 Форсированно завершаем процесс через kill и exit code 11. __import__('os').kill(__import__('os').getpid(), 11) Но это просто быстрый выход. 🔸 Делаем что-то что вызовет ошибку со страшным сообщением что всё сломалось! Перегружаем стек вызова рекурсией, заведомо увеличив лимит до не приличия высоко. __import__('sys').setrecursionlimit(1<<30);f=lambda f:f(f);f(f) 🔸Ломаем парсер AST __import__('ast').literal_eval('1+1'*10**6) Все эти вызовы приводят к такой ошибке: Process finished with exit code 139 (interrupted by signal 11: SIGSEGV) Хм... а зачем это может быть нужно? Может кому-то хотите устроить подлянку 👹, а может тестируете дебагер. Таким падением можно "указать" юзеру что он зашел куда не следует чтобы больше так не делал 😨 Всё это надуманные примеры. Но тем не менее, теперь вы теперь знаете как это сделать😉. PS. Не советую использовать этот код в рабочих проектах! #tricks

825 views

Hashtags

Објавено 28 авг.

Какие ассоциации у вас вызывает число 404? Сразу вспоминается ошибка 404 Not Found (не найдено). Именно такой номер имеет PEP 404 Python 2.8 Un-release Schedule для несуществующего релиза Python 2.8. В нём нам сообщают что релиз 2.8 никогда не выйдет и даются советы как перейти на ветку 3.х. #pep#2to3

762 views

Hashtags

Објавено 26 авг.

Как узнать кто вызвал функцию? Порой требуется выяснить, кто именно вызвал конкретную функцию? Конечно, можно запустить дебаг и выполнять построчно логику отслеживая откуда мы пришли в конкретную точку. Но это долго. Чтобы просто узнать имя функции которая вызвала текущую функцию можно сделать так. # myscript1.py import inspect def function1(): # распечатаем имя вызывающей функции print('Called from:', inspect.stack()[1][3]) def function2(): function1() function2() Запускаем python3 myscript1.py Called from: function2 Но так мы увидим лишь имя предыдущей функции. А как узнать полный список вызовов? Traceback удобен тем, что показывает цепочку вызовов, которая привела к ошибке. Но модуль traceback также позволяет распечатать стек вызовов не выбрасывая исключение. # myscript2.py import traceback def function1(): ... traceback.print_stack() ... def function2(): function1() function2() Запускаем файл python myscript2.py File "myscript.py", line 9, in <module> function2() File "myscript.py", line 7, in function2 function1() File "myscript.py", line 4, in function1 traceback.print_stack() #tricks

760 views

Hashtags

Објавено 24 авг.

Как прочитать файл из ZIP архива не распаковывая этот архив? Недавно была задача достать данные из JSON файла который лежит в ZIP архиве. Первое, что приходит в голову – распечатать архив в TEMP и найти нужный файл. Но с Python можно сделать проще: прочитать нужный файл в архиве не извлекая всё содержимое. Например, есть некий архив archive.zip. Где-то внутри есть файл config.json который нам надо прочитать. Вот код который это сделает: from zipfile import ZipFile from pathlib import Path import json def get_json_from_zip(archive, file_name): zip = ZipFile(archive) for zipname in zip.namelist(): if Path(zipname).name == file_name: with zip.open(zipname) as f: return json.load(f) config_name = 'config.json' archive_path = 'archive.zip' conf = get_json_from_zip(archive_path, config_name) #tricks#libs

714 views

Hashtags

Објавено 21 авг.

Я очень часто работаю в REPL. Удобная штука для разработки, поисков, тестов, дебага... Иногда случается такая ситуация, когда я делаю вызов какой-либо функции и вижу распечатку результата в консоли. И только потом понимаю что нужно было это сохранить в переменную! >>> get_some() <some result> А почему бы не выполнить еще раз но уже сохранив в переменную? >>> result = get_some() Да, чаще всего так и делаю, но иногда это неудобно или недопустимо. Например, если результат считается долго или каждый раз он будет другой. В этом случае выручает одна интересная особенность интерактивной консоли, это переменная "_"(нижнее подчеркивание). Python по умолчанию сохраняет в неё результат последнего вызова если этот результат не был никуда сохранён. >>> get_some() <some result> >>> print(_) <some result> То есть, сразу после вызова достаточно скопировать значение из этой переменной >>> get_some() <some result> >>> result = _ >>> print(result) <some result> Это не сработает в двух случаях: 🔸 Если у вас не REPL, то есть простой запуск скрипта. 🔸 Если вы самостоятельно объявили эту переменную или сделали импорт с этим именем. >>> _ = False >>> get() <some result> >>> print(_) False #tricks

711 views

Hashtags

Објавено 19 авг.

Думаете что curses крутая библиотека но сложная? Urwid тоже не очень помогает? Тогда посмотрите на высокоуровневую библиотеку py_cui. Это обертка для curses которая предлагает простую схему построения интерфейсов основанную на GridLayout. Он позволяет располагать различные виджеты плиткой, что-то вроде интерфейса Metro. Библиотека реализует простой принцип навигации: 🔸 переключение между плитками: стрелки на клавиатуре В обычном режиме вы можете "гулять" по сетке выбирая нужный виджет. 🔸 активация виджета: Enter В этом режиме вы входите в контекст виджета и можете с ним взаимодействовать 🔸 деактивация виджета: Esc По нажатию на Esc вы возвращаетесь в режим выбора виджета Посмотрите примеры и зацените приложение для работы с GIT. А еще на нем можно простые игры писать. PS. При желании набор символов для рисования границ виджетов можно изменить. #libs

675 views

Hashtags

12•••10•••2021222324•••303132
ПретходнаСтраница 22 од 32Следна