Pull to refresh

Материалы продвинутого уровня по Питону

Reading time 5 min
Views 43K
PythonВ мире все примерно распределяется в соответствии с принципом Паретто. Меньшая часть — богатые, большая часть — бедные (читающий, ты входишь в золотой миллиард). Тоже касается и материалов о программировании. Порой очень сложно найти хоть что-нибудь не начального уровня.

После прочтения Dive into Python или подобной ей и ознакомления с документацией возникает вопрос, а что читать дальше? Можно обратиться к списку книг на python.org. Там есть раздел Advanced Books, но в нем всего лишь 6 книг (седьмая не выходила), и только одну я бы назвал по-настоящему стоящей.

К счастью, у Питона есть очень подробная и качественная документация. Но даже в ней многие темы либо только поверхностно затронуты, либо их очень сложно найти (потому что документация большая, и если не знаешь, куда смотреть, не найдешь).

Ниже собраны сложные материлы про Питон, его устройство и возможности. Все на английском (грех, не знать технический английский). Про Dive into Python я слукавил. Большинство приведенных материалов требуют хорошее знание Питона и наличие опыта программирования на нем.



Статьи из официальной документации


Data model
Базовая статья про объекты в Питоне. Ее надо знать наизусть (правда-правда). Без нее дальнейшее понимание, как работает Питон, практически невозможно. Также хотелось бы заострить внимание на:
  • Implementing Descriptors. По-моему, дескрипторы — это лучшая, непревзойденная, возможность Питона, но при этом самая недооцененая. Сейчас они, по большей степени, используются только в фреймворках. Надо будет, как-нибудь, написать, насколько дескрипторы упрощают разработку и улучшают качество кода.
  • Customizing attribute access. И первое, про что здесь надо прочитать, это про разницу __getattribute__ и __getattr__.
  • Special method lookup for new-style classes. Важно: доступ к магическим методам происходит в обход __getattribute__, если вы только не вызываете их напрямую (len(obj) и obj.__len__()).

Exceptions
В исключениях надо разобраться с наследованием (PEP 352: Exceptions as New-Style Classes). В Питоне 2.4 Exception — это классический класс, не сабкласс object'а. В Питоне 2.5 Exception уже наследует BaseException(object), т.е. это уже новый класс. Также обратите внимание на то, что в версии 2.4 KeyboardInterrupt и SystemExit наследуют Exception, а в 2.5 — BaseException.

Еще рекомендую прямо взять и сравнить (поставить два окна рядом) иерахию исключений в Питоне 2.4 и иерархию в Питоне 2.6 (по сравнению с 2.5 добавилось только несколько классов).


Статьи про классы, атрибуты и методы


Unifying types and classes in Python 2.2, Guido van Rossum
Статья от создателя языка о том, что такое new-style classes. Думаю, не требуется писать, почему ее надо прочитать (лучше, несколько раз).

The Python 2.3 Method Resolution Order, Michele Simionato
Как происходит вычисление порядка доступа к методам (MRO) и атрибутам при множественном наследовании. У новых классов можно получить через атрибут __mro__.

Shalabh Chaturvedi:
Очень хорошие и большие книги-статьи + красиво сверстаны.

Python Types and Objects
Как соотносятся type и object.

Python Attributes and Methods
Как происходит доступ к атрибутам в новых классах, отличие функций и методов, описание дескрипторов и MRO.

Be Pythonic
Краткая, не столь важная статья, как писать код в стиле Питона (добавил только для того, чтобы перечислить все статьи автора).


Метаклассы


Хотелось бы привести одну [очень известную] цитату о метаклассах:
           English                             Русский
[Metaclasses] are deeper magic      Метаклассы -- это сложная магия, 
than 99% of users should ever       о которой 99% разработчиков даже 
worry about. If you wonder          не стоит беспокоиться. Если вы 
whether you need them, you          спрашиваете, нужны ли вам 
don't (the people who actually      метаклассы, знайте, они вам не
need them know with certainty       нужны (люди, которым они 
that they need them, and don't      действительно нужны, абсолютно 
need an explanation about why)      уверены в этом, и им не требуется 
Tim Peters (c.l.p post 2002-12-22)  объяснение почему).

                                    (очень плохо, что вы не знаете 
                                    английский, в этой статье ссылки
                                    только на англоязычные материалы)

Проще вставить как моноширинный, чем пытаться изобразить таблицей с ячейками без атрибута width, не говоря уж про стили. Я честно пытался минут 20.

Так вот, это не так. Если вы не знаете метаклассы, вы не знаете Питон. Теперь, после мотивирования, можно и к статьям вернуться.

Customizing class creation
Официальная документация.

Python Metaclasses: Who? Why? When?, Mike Fletcher, PDF
Много практических примеров, как и зачем можно [но часто не нужно, авт.] использовать метаклассы.

Metaclass programming in Python, Часть 2, Часть 3, David Mertz, Michele Simionato
Очень подробные статьи, разбирается все по косточкам. Единственно НО: очень занудно и академично написано. Хотя вполне возможно, что это просто у меня предвзятое отношение к статьям на IBM DeveloperWorks.

Metaclasses in Python 3000, PEP 3115
Метаклассы в третьем Питоне. Основные отличия — возможность передавать kwargs прямо в определении класса class Foo(*bases, **kwargs) и поддержка функции __prepare__, которая должна вернуть маппинг для атрибутов класса, например упорядоченный словарь.

В целом про метаклассы: знать, знать и еще раз знать. Но! Если вы решили их использовать, подумайте, потом еще раз подумайте и, все-таки, попробуйте обойтись без них ;-D.


Статьи на другие темы


Python 401: Some Advanced Topics, PDF
Лучшее и самое подробное объяснение интерполяции строк ('Hello, %s.' % username). Плюс итераторы, генераторы, дескрипторы, метаклассы, почему методы медленне функций (потому что при каждом вызове создается объект) и т.д.

How-To Guide for Descriptors, Raymond Hettinger
Как работают дескрипроты, как их вызывать и использовать.

David Beazley
Пишет очень хорошие, а главное, практические статьи. Только у него можно прочитать, как с помощью генераторов распарсить лог апача или как написать «операционную систему» на корутинах.

Inside the Python GIL
Как работает Global Interpreter Lock и почему использование тредов в Питоне может замедлять программу.

Inside the New GIL (Python 3.2)
Описание и тесты нового GIL, который будет в Питоне 3.2 (и может быть, будет портирован в 2.7).

Generator Tricks for Systems Programmers, Версия 2
Практическое использование генераторов и их преимущества (скорость + низкое потребление памяти).

A Curious Course on Coroutines and Concurrency
Что такое корутины и почему надо четко отличать их от обычных генераторов (у них функции разные: одни выдают данные, другие их перерабатывают). В конце он напишет на них аналог операционной системы.

Мои рекомендации
Посмотрите результат dir(method) и dir(func). Прочитайте справку по модулям new, itertools, functools. Обязательно, если еще не знаете, познакомьтесь с функциями map, reduce, zip и filter (map может принимать сразу много итераторов).

Прочитайте про Abstract Base Classes и коллекции. И не только в Питоне, но и в Яве. ABC во многом идет по ее следам.

Посетите сайт PyCon, ежегодной конференции разработчиков. Там же доступны и материалы прошлых конференций (хотя часто не доступны). Смотреть надо в Conference/Schedule.

Чуть не забыл, обязательно прочитайте Python Cookbook. Эта практическая книга просто превосходна. Как быстро сортировать, используя метод decorate-sort-redecorate, какой алгоритм сортировки использует Питон (insertion sort для небольшого количества элементов и timsort для большого), как работать с XML, динамически создавать модули и многое другое.


Заключение


Написал, что вспомнил или обнаружил в закладках. Надеюсь, многим поможет. Также не забывайте ipython и его? и ??.. (для тех, кто не знает, это очень мощная интерактивная оболочка для Питона, а вопросы показывают информацию об объектах, например, import sys; sys?). Да прибудет в вами сила.
Tags:
Hubs:
+130
Comments 23
Comments Comments 23

Articles