Книга: Марк Лутц - Изучаем Python, 5-е изд., Т. 2
Назад: Метаклассы
Дальше: Установка и конфигурирование

Все хорошее когда-нибудь заканчивается

 

Встречайте окончание книги! Теперь, когда вы продвинулись настолько далеко, в заключение я хочу сказать несколько слов об эволюции Python, прежде чем отпускать вас в мир разработки программного обеспечения. Конечно, эта тема субъективна по своей природе, однако жизненно важна для всех пользователей Python.
У вас была возможность самостоятельно увидеть целиком весь язык — включая ряд расширенных средств, которые могут выглядеть расходящимися с его парадигмой написания сценариев. Хотя многие с пониманием воспримут это как статус-кво, в проекте с открытым кодом очень важно, чтобы некоторые задавали также и вопросы “почему”. Ведь в итоге путь истории Python — и ее истинный результат — по крайней мере, частично зависит от вас.
Парадокс Python
Если вы читали настоящую книгу или подходящее ее подмножество, тогда должны быть в состоянии беспристрастно взвешивать компромиссы, касающиеся Python. Вы видели, что Python представляет собой мощный, выразительный и даже забавный язык программирования, который послужит технологией, позволяющей вам двигаться дальше куда угодно. Одновременно вы также заметили, что современный Python является чем-то вроде парадокса: он расширяется, чтобы содержать инструменты, которые многие считают совершенно избыточными и необычайно сложными — со скоростью, которая, по-видимому, только увеличивается.
Со своей стороны, как один из первых сторонников Python, я наблюдал, как с годами он трансформировался из простого средства в сложно устроенный инструмент с постоянно меняющимися возможностями. Похоже, его сложность возросла, по крайней мере, до уровня сложности других языков, из-за чего многие из нас перешли на Python. И точно так же, как в других языках, ситуация неизбежно благоприятствовала растущей культуре, где непонятность считается признаком славы.
Сложившееся положение противоречит первоначальным целям Python настолько, насколько вообще возможно. Запустите команду import this в любом интерактивном сеансе Python, чтобы увидеть, что я имею в виду — мировоззрение, из которого я неоднократно приводил вытяжки в контекстах, где оно очевидно нарушалось. На многих уровнях его основные идеалы ясности, простоты и отсутствия избыточности были либо простодушно забыты, либо легкомысленно отброшены.
Конечным результатом оказывается язык и сообщество, которые в наши дни можно было бы описать рядом терминов, используемых мною в отношении языка Perl в главе 1 первого тома. Несмотря на то что Python все еще может многое предложить, как объясняется в следующем разделе, такая тенденция грозит свести на нет большую часть его осознаваемого преимущества.
О "необязательных" языковых средствах
Ближе к началу предыдущей главы я приводил мнение Тима Петерса о том, что метаклассы не являются предметом интереса для 99% программистов на Python, чтобы подчеркнуть их кажущуюся непонятность. Тем не менее, утверждение не вполне точно, причем не только в числовом отношении. Автор мнения — известный участник процесса разработки и сторонник языка Python с первых дней его существования, и я не намеревался выбирать кого-нибудь просто так. Кроме того, я и сам часто делаю такие заявления о неясности языковых средств — по сути, в различных изданиях как раз этой книги.
Однако проблема в том, что подобные заявления в действительности применимы лишь к людям, работающим в одиночку и использующим исключительно код, который они написали самостоятельно. Как только кто-то в организации задействует “необязательное” расширенное языковое средство, оно перестает быть необязательным, а фактически навязывается всем в организации. То же самое относится к программному обеспечению, разработанному за пределами организации, которое вы применяете в своих системах — если его автор использовал сложное или чуждое языковое средство, тогда оно больше не будет необязательным для вас, поскольку вы должны понимать это средство, чтобы работать с кодом либо изменять его.
Следующее наблюдение касается всех расширенных тем, раскрытых в настоящей книге, в том числе перечисленных в качестве уровней “магии” в начале предыдущей главы и многих других. К ним относятся:
генераторы, декораторы, слоты, свойства, дескрипторы, метаклассы, диспетчеры контекстов, замыкания, super, пакеты пространств имен, Unicode, аннотации функций, относительное импортирование, аргументы с передачей только по ключевым словам, методы классов, статические методы и даже неясные сценарии применения включений и перегрузки операций.
Если любой человек или программа, с которой вам необходимо работать, задействует такие инструменты, тогда они тоже становятся частью вашей обязательной базы знаний.
Чтобы посмотреть, насколько все способно быть обескураживающим, достаточно лишь принять во внимание процедуру наследования нового стиля из главы 40 — устрашающе запутанная модель, которая может сделать знание дескрипторов и метаклассов предварительным условием для понимания даже базового распознавания имен. Встроенная функция super из главы 32 аналогичным образом вносит свой вклад, навязывая чрезвычайно неявный и искусственный алгоритм MRO читателям любого кода, где используется super.
Совокупный эффект такого чрезмерного проектного решения приводит либо к радикальному усилению требований к обучению, либо к взращиванию базы пользователей, которые понимают применяемые ими инструменты только частично. Очевидно, что это далеко от идеала для тех, кто надеется использовать Python более простыми путями, и противоречит основной идее написания сценариев.
Против тревожных усовершенствований
Данное наблюдение также применимо ко многим избыточным свойствам, таким как метод str. format из главы 7 первого тома и оператор with из главы 34 — инструменты, которые позаимствованы из других языков и пересекаются с инструментами, давно присутствующими в Python. Когда программисты используют множество способов достижения той же самой цели, то все они становятся обязательным знанием.
Давайте будем честными: в последние годы Python изобилует избыточностью. Как я намекнул в предисловии, а вы удостоверились на личном опыте, современный мир Python переполнен дубликатами и расширениями функциональности, которые кратко описаны в табл. 41.1, помимо других упоминавшихся в книге.
Таблица 41.1. Выборочные примеры избыточности и взрывного роста средств в Python
Категория
3 главных парадигмы программирования
2 несовместимых линейки
3 инструмента форматирования строк
4 инструмента доступа к атрибутам
2 оператора финализации 4 вида включений
3 инструмента дополнения классов
4 вида методов
2 системы хранения атрибутов
4 разновидности импортирования
2 протокола координирования суперклассов
5 форм оператора присваивания
2 типа функций 5 форм аргументов функций
2 источника поведения классов 4 варианта предохранения состояния
2 модели классов
Описание
Процедурное, функциональное, объектноориентированное
Python 2.Х и Python З.Х с классами нового стиля в обеих
Выражение %,str.format, string.Template
_getattr_,_getattribute_, свойства,
дескрипторы
try/finally, with
Списковое включение, включение множества, включение словаря, генератор
Вызовы функций, декораторы, метаклассы
Методы экземпляра, статические методы, методы класса, методы метакласса
Словари, слоты
Импортирование модулей, импортирование пакетов, относительное импортирование пакетов, импортирование пакетов пространств имен
Прямые вызовы, super + MRO
Базовый, с множеством имен, дополненный, последовательности, со звездочкой
Нормальная, генераторная
Базовый, имя=значение, *pargs, **kargs, с передачей только по ключевым словам
Суперклассы, метаклассы
Классы, замыкания, атрибуты функций, изменяемые объекты
Классическая + нового стиля в Python 2.Х, в Python З.Х классы нового стиля обязательны
Окончание табл. 41.1
КатегорияОписание
2 модели UnicodeНеобязательная в Python 2.Х, обязательная в Python З.Х
2 режима PyDocКлиент с графическим пользовательским интерфейсом, требующий режима с единым браузером в последних версиях Python З.Х
2 схемы хранения байт-кодаПервоначальная, только pycache в последних версиях Python З.Х
Если вам небезразличен Python, тогда вы должны уделить время на просмотр табл. 41.1. Она отражает искусственно созданный взрывной рост функциональности и размера инструментального комплекта — 59 концепций, которые все вместе представляют собой непростое испытание для новоприбывших. Большинство категорий начиналось только с одного первоначального элемента в Python, многие были расширены отчасти для имитации других языков, и только несколько последних можно упростить, сделав вид, что последняя версия Python является единственной имеющей значение для программистов на этом языке.
Я подчеркивал, что в этой книге избегаю неоправданной сложности, но на практике как продвинутые, так и новые инструменты обычно подталкивают к их освоению — зачастую по причинам, связанным с непреодолимым желанием программиста продемонстрировать собственную удаль. Общим итогом оказывается то, что много кода на Python в наши дни изобилует такими сложными и чуждыми инструментами. То есть ничто не является “необязательным ” (в кавычках), если нет ничего по-настоящему необязательного.
Сложность или мощь
Вот почему некоторых старожилов Python (включая меня) иногда беспокоит то, что Python с течением времени, похоже, становится все крупнее и сложнее. Новые средства, добавленные ветеранами, неофитами и даже любителями, могли слишком высоко поднять планку для новоприбывших. Хотя основные идеи языка Python вроде динамической типизации и встроенных типов по существу остались теми же, его расширенные дополнения могут стать обязательным чтением для любого программиста на Python. По этой причине я раскрываю здесь такие темы, невзирая на их отсутствие в предшествующих изданиях. Невозможно пропустить расширенные средства, если они есть в коде, который вам нужно понять.
С другой стороны, как упоминалось в главе 1 первого тома, для большинства наблюдателей язык Python все еще заметно проще многих своих современников и возможно сложен лишь настолько, насколько требуют его многочисленные роли. Несмотря на то что Python обзавелся многими такими же инструментами, как присутствующие в языках Java, C# и C++, они имеют тенденцию быть более легковесными в контексте динамически типизированного языка написания сценариев. При всем его росте с годами Python по-прежнему относительно легко изучать и использовать в сравнении с альтернативами, а изучающие его новички часто могут по мере необходимости выбирать сложные темы.
И, откровенно говоря, прикладные программисты, как правило, проводят большую часть своего времени, работая с библиотеками и расширениями, но не с продвинутыми и нередко загадочными языковыми средствами. Например, книга Programming Python (http: //) в основном посвящена объединению Python с прикладными библиотеками, предназначенными для работы с графическими пользовательскими интерфейсами, базами данных и веб-сетью. Она не имеет дела с экзотическими языковыми инструментами (хотя Unicode все еще навязывает себя на многих этапах, и попутно неожиданно обнаруживается странное генераторное выражение и yield).
Кроме того, оборотной стороной такого роста является то, что Python стал мощнее. При надлежащем применении инструменты наподобие декораторов и метаклассов возможно не только “круты”, но позволяют творческим программистам строить более гибкие и удобные API-интерфейсы для использования другими программистами. Как мы видели, они также способны предоставлять эффективные решения задач инкапсуляции и сопровождения.
Простота или элитарность
Оправдан ли потенциальный рост объема обязательных знаний Python — решать вам. Что бы там ни было, часто проблему решает уровень мастерства человека — более опытные программисты предпочитают более сложные инструменты и склонны забывать об их влиянии на другие стороны. К счастью, ситуация не является абсолютом; квалифицированные программисты также понимают, что простота - это хорошая технология, и сложные инструменты должны применяться только там, где они оправданы. Сказанное справедливо для любого языка программирования, но особенно для такого, как Python, который часто доступен начинающим программистам в качестве дополнительного инструмента.
Важно помнить о том, что многие люди, использующие Python, некомфортно себя чувствуют даже с базовым объектно-ориентированным программированием. Поверьте мне; я встречал тысячи таких. Хотя язык Python в принципе не считается тривиальной темой, рядовые разработчики программного обеспечения имеют совершенно четкое мнение: неоправданно добавленная сложность никогда не приветствуется, особенно если она обусловлена личными предпочтениями нерепрезентативного меньшинства. Независимо от того, было так задумано или нет, это часто вполне предсказуемо воспринимается как элитарность — непродуктивный и неприличный образ мыслей, которому не место в таком широко применяемом инструменте, как Python.
Конечно, проблема имеет социальный характер и касается как отдельных программистов, так и проектировщиков языка. Тем не менее, в “реальном мире”, где программное обеспечение с открытым кодом подвергается оценке, основанные на Python системы, которые требуют от своих пользователей усвоения тонкостей метаклассов, дескрипторов и тому подобного, вероятно должны соответствующим образом отрегулировать ожидаемый объем потребления. Если эта книга выполнила свою работу, то вы поймете, что простота в программировании является одним из наиболее важных и долговременных решений.
Заключительные размышления
Итак, в вашем распоряжении ряд наблюдений от кое-кого, кто использовал, обучал и пропагандировал язык Python на протяжении более двух десятков лет и по-прежнему желает ему в будущем ничего кроме самого наилучшего. Разумеется, здесь нет ничего совершенно нового. В действительности рост объема самой книги, похоже, свидетельствует о влиянии собственного роста Python — если только не воспринимать его как ироничный панегирик первоначальному представлению этого языка в качестве инструмента, который должен был упрощать программирование и быть доступным как экспертам, так и неспециалистам. Судя по одному лишь весу языка, по всей видимости, этой мечтой либо пренебрегли, либо вовсе от нее отказались.
Однако нынешний рост популярности Python не демонстрирует никаких признаков ослабления — сильный контраргумент в вопросах сложности. Сегодняшний мир Python по понятным причинам может быть менее озабочен достижением первоначальных и вероятно идеалистических целей, чем применением его имеющейся формы в своей работе. Язык Python многое делает в практическом мире сложных требований программирования, и это все еще достаточное основание рекомендовать его для решения многочисленных задач. Помимо исходных целей массовая притягательность квалифицируется как одна из форм успеха, хотя вердикт ее значимости должно вынести время.
Если вас интересуют дальнейшие размышления об эволюции и кривой обучения Python, тогда ознакомьтесь с моей статьей по ссылке http://learning-python.com/pyquestions3.html. Это важные практические вопросы, которые являются ключевыми для будущего Python и заслуживают большего внимания, чем я уделил им здесь. Но они крайне субъективны, а эта книга — не философский трактат, и вдобавок она уже успела превысить запланированный объем.
Более важно то, что в проекте с открытым кодом, подобном Python, ответы на такие вопросы должны вырабатываться заново каждой волной новоприбывших. Я надеюсь, что волна, с которой прибудете вы, принесет с собой столько же здравого смысла, сколько и веселья в выстраивании будущего Python.
Куда двигаться дальше?
Вот и все. Вы официально добрались до конца книги. Освоив Python вдоль и поперек, вашим следующим шагом, если только вы решитесь на него, будет исследование библиотек, методик и инструментов, доступных в предметных областях, где вам придется работать.
Поскольку язык Python настолько широко используется, вы обнаружите достаточно ресурсов для его применения практически в любом приложении, которое вы только можете себе представить — от графических пользовательских интерфейсов, веб-сети и баз данных до численного программирования, робототехники и системного администрирования. Ссылки на популярные инструменты и темы вы найдете в главе 1 первого тома и в веб-сети.
Именно здесь язык Python становится по-настоящему забавным, но на этом история настоящей книги заканчивается, и начинаются другие. Надеюсь вскоре вас увидеть в области программирования прикладных приложений.
Удачи вам в путешествии. А еще, конечно же, “всегда смотрите на светлую сторону жизни”!
На бис: распечатайте собственный сертификат об окончании!
И последнее: вместо упражнений в последней части книги я предлагаю вам бонусный сценарий для самостоятельного изучения и запуска. Я не могу предоставить сертификат об окончании каждому читателю книги (и даже если бы мог, то он все равно мало что стоит), но в состоянии включить непритязательный сценарий на Python,
который это сделает. В файле certificate .ру с показанным далее содержимым находится сценарий на Python 2.Х и З.Х, который создает простой сертификат об окончании чтения книги в форме текстового и HTML-файла, после чего отображает его в стандартном веб-браузере на вашем компьютере.
#!/usr/bin/python
к и п
Файл certificate.ру: сценарий на Python 2.Х и З.Х.
Генерирует простой сертификат об окончании чтения: выводит
и сохраняет в текстовом и HTML-файле, отображаемом в веб-браузере.
п п и
from _future_ import print_function # Совместимость с Python 2.X
import time, sys, webbrowser
if sys.version_info[0] == 2: input = raw_input import cgi
# Совместимость с Python 2.Х
htmlescape = cgi.escape else:
import html
htmlescape = html.escape
# Для разделительных строк
# Отображать в браузере
# Имена выходных файлов
maxline = 60 browser = True saveto = 'Certificate.txt' template = """
% s
===> Official Certificate <*===
Date: %s
This certifies that:
\t%s
has survived the massive tome:
\t%s
and is now entitled to all privileges thereof, including the right to proceed on to learning how to develop Web sites, desktop GUIs, scientific models, and assorted Apps, with the possible assistance of follow-up applications books such as Programming Python (shameless plug intended)
--Mark Lutz, Instructor
(Note: certificate void where obtained by skipping ahead.) %s
и и и
# Взаимодействие, настройка for с in 'Congratulations!' print(с, end=' ') sys.stdout.flush() time.sleep(0.25) print ()
upper () :
# Иначе некоторые командные оболочки ждут \п
date = time.asctime ()
name = input('Enter your name: ') .strip() or ’An unknown reader'
sept = 1 * • * maxline
book = 'Learning Python 5th Edition'
# Создание версии в текстовом файле file = open(saveto, ' w')
text = template % (sept, date, name, book, sept) print(text, file=file) file.close()
# Создание версии в файле html
htmlto = saveto.replace(1.txt', '.html') file = open (htmlto, 'w')
tags = text. replace (sept, '<hr>') # Вставка нескольких html-дескрипторов tags = tags.replace('===>', ' <hl align=center>') tags = tags.replace('<===', '</hl>')
tags = tags.split('\n') # Построчный режим
tags = [' <p>' if line == ' '
else line for line in tags] tags = ['<i>%s</i>' % htmlescape (line) if line[:l] == ' \t' else line for line in tags] tags = ' \n' .join(tags)
link = '<i><a href=" support site</a></i>\n' foot = 1 <table>\n<tdximg src=Mora-lp. jpg” hspace=5>\n<td>%s</table>\n' % link tags = ' <htmlxbody bgcolor=beige>' + tags + foot + ' </body></html>'
print(tags, file=file) file.close()
# Отображение результатов
print (’ [File: %s] ' % saveto, end=") print(f\n’ * 2, open(saveto).read())
if browser:
webbrowser.open(saveto, new=True) webbrowser.open(htmlto, new=False)
if sys.platform.startswith('win'):
input (' [Press Enter] ' ) # Оставить окно открытым при щелчке в Windows
Запустите сценарий certificate .ру самостоятельно и изучите его код, чтобы подытожить ряд идей, которые были раскрыты в книге. Он доступен в пакете кода примеров. В его коде вы не найдете дескрипторов, декораторов, метаклассов или вызовов super, но все же это типичный сценарий на Python.
В результате запуска сценарий сгенерирует веб-страницу, представленную на рис. 41.1. Конечно, все могло бы выглядеть гораздо более пышно, т.к. Python поддерживает инструменты для работы с документами PDF и другими форматами, например, Sphinx из главы 15 первого тома. Но ведь вы в конце книги, а потому заслужили еще одну шутку или две...
/C./Code/Certif icate.html X '
j 4г С1 | 0 f»le:///C:/Code/Certificate.html ••• © Н ^
К-VIII
Official Certificate
Date: Mon Nov 18 12:47:03 2019
This certifies that:
Yourij Artemenko
has survived the massive tome:
Learning Py thon 5th Edition
5;
and is now entitled to all privileges thereof, including the right to proceed on to learning how to develop Web sites, desktop GUIs, scientific models, and assorted Apps, with the possible assistance of follow-up applications books such as Programming Python (shameless plug intended).
--Mark Lutz, Instructor
(Note: certificate void where obtained by skipping ahead.)
Book support site
J|
Рис. 41.1. Веб-страница, созданная и открытая сценарием certificate .ру
ЧАСТЬ IX
Приложения
Приложение А
Назад: Метаклассы
Дальше: Установка и конфигурирование