Примечания

1

Если вы не работаете с сетями на низком уровне, то практически не заметите изменений. Увидите только то, что выражение print стало функцией. В противном случае фраза «немного недовольны» является преуменьшением: разработчики, ответственные за крупные и популярные библиотеки для работы с Интернетом, сокетами или сетями, которые взаимодействуют со строками, представленными в формате Unicode и байтовом формате, должны были (и все еще должны) внести значительные изменения. Подробнее об изменениях, начавшихся, когда Python 3 явился миру, можно узнать из статьи под названием Everything you thought you knew about binary data and Unicode has changed (http://bit.ly/text-vs-data).

2

Высокоуровневый список изменений вы найдете по адресу http://python3porting.com/stdlib.html в стандартной библиотеке Python (Python’s Standard Library).

3

Термин «базовая реализация» точно отражает определение языка. Его поведение указывает на то, как должны вести себя другие реализации.

4

Модули расширения написаны на C, но могут использоваться и в Python.

5

На момент написания книги.

6

У разных людей разные мнения на этот счет. Реализации OS X Python могут различаться. Они даже могут иметь разные библиотеки, характерные для OS X. Вы можете прочитать небольшую статью, автор которой критикует наши рекомендации, в блоге Stupid Python Ideas (http://bit.ly/sticking-with-apples-python). В ней поднимаются логичные вопросы о конфликтах имен, которые возникают, когда пользователь переключается с CPython 2.7 для OS X на CPython 2.7, независимый от конечной реализации. Если для вас это может стать проблемой, используйте виртуальную среду. Или хотя бы оставьте CPython 2.7 для OS X в том же месте, чтобы система четко работала, установите стандартный Python 2.7, реализованный с помощью CPython, измените путь и никогда не пользуйтесь версией OS X. Далее все будет работать как часы, включая продукты, которым нужна версия Python для OS X.

7

Честно говоря, лучший вариант — с самого начала использовать либо Python 3, либо виртуальные среды, куда вы не будете устанавливать ничего, кроме virtualenv и, возможно, virtualenvwrapper в соответствии с советами Хинека Шлавака (Hynek Schlawack) (https://hynek.me/articles/virtualenv-lives/).

8

Это гарантирует, что версия Python, которую вы собираетесь использовать, будет той, которую только что установил Homebrew (оставил оригинальную версию Python нетронутой).

9

Символьная ссылка — это указатель на реальное местоположение файла. Вы можете проверить, куда ведет ссылка, набрав, например, ls — l /usr/local/bin/python3 в командной строке.

10

Пакеты, которые минимально совместимы с Setuptools, предоставляют достаточно информации для библиотеки, чтобы она могла идентифицировать и получить все зависимые пакеты. Для более подробной информации обратитесь к документации Packaging and Distributing Python Projects (https://packaging.python.org/en/latest/distributing.html), PEP 302 (https://www.python.org/dev/peps/pep-0302/) и PEP 241 (https://www.python.org/dev/peps/pep-0241/).

11

Сторонники такого подхода говорят, что это единственный способ гарантировать, что ничто не сможет переписать старую версию существующей библиотеки и тем самым навредить другому коду ОС, зависимому от версии библиотеки.

12

Для получения более подробной информации обратитесь к инструкции по установке pip (https://pip.pypa.io/en/latest/installing.html).

13

Пакеты, которые минимально совместимы с Setuptools, предоставляют достаточно информации для библиотеки, чтобы она могла идентифицировать и получить все зависимые пакеты. За более подробной информацией обратитесь к документации Packaging and Distributing Python Projects, PEP 302 и PEP 241.

14

Или IronPython (рассматривается в подразделе «IronPython» раздела «Реализации» главы 1).

15

Вы должны знать хотя бы версию Python, которую планируете использовать, а также требуемую разрядность. Мы рекомендуем 32-битную версию, поскольку все сторонние DLL имеют 32-битную версию, но не все — 64-битную. Самое популярное место, где вы можете найти скомпилированные бинарные файлы, — сайт ресурсов Кристофа Голка (Christoph Gohlke) (http://www.lfd.uci.edu/~gohlke/pythonlibs/). Что касается scikit-learn, Карл Клеффнер (Carl Kleffner) выполняет сборку бинарных файлов с помощью MinGW (https://pypi.anaconda.org/carlkl/simple/) для подготовки к итоговому релизу для PyPI.

16

В Anaconda больше бесплатных функций, он поставляется вместе со Spyder — более качественной IDE. Если вы используете Anaconda, для вас может оказаться полезным предметный указатель бесплатного пакета Anaconda (https://repo.continuum.io/pkgs/) и пакета Canopy (https://www.enthought.com/products/canopy/package-index/).

17

Это означает, что вы на 100 % уверены, что все необходимые DLL и драйверы имеют 64-битную версию.

18

В переменной среды PATH перечислены все возможные каталоги, в которых операционная система будет искать исполняемые программы (например, Python и его сценарии вроде pip).

19

Windows PowerShell предоставляет язык сценариев для командной строки, который напоминает оболочки Unix — пользователи Unix могут работать с ним, не читая руководство, но при этом он имеет функциональность, которую можно применять только в Windows. Создан на основе фреймворка. NET. Более подробную информацию ищите в статье «Using Windows PowerShell от компании Microsoft» (http://bit.ly/using-windows-powershell).

20

Для получения более подробной информации обратитесь к инструкциям по установке pip (https://pip.pypa.io/en/latest/installing.html).

21

Пакеты, которые минимально совместимы с Setuptools, предоставляют достаточно информации для библиотеки, чтобы она могла идентифицировать и получить все зависимые пакеты. Более подробные сведения ищите в документации Packaging and Distributing Python Projects (https://packaging.python.org/en/latest/distributing.html), PEP 302 (https://www.python.org/dev/peps/pep-0302/) и PEP 241 (https://www.python.org/dev/peps/pep-0241/).

22

Intel и Anaconda — партнеры (http://bit.ly/announce-anaconda-intel), и все специализированные пакеты компании Intel (https://anaconda.org/intel) доступны только при использовании conda. Однако вы всегда можете выполнить команду conda install pip и применить pip (или pip install conda и использовать conda).

23

Если вам понадобится создавать расширения для Python с помощью языка C, обратитесь к статье «Расширяем Python с помощью C или C++» (https://docs.python.org/3/extending/extending.html). Для получения более подробной информации см. главу 15 книги «Python Cookbook» (http://bit.ly/python-cookbook).

24

Сниппеты — это фрагменты кода, которые часто повторяются, вроде стилей CSS или определений классов. Вы можете использовать для них автозаполнение, если введете несколько символов, а затем нажмете клавишу Tab.

25

Просто откройте редактор, введя в командной строке vi (или vim) и нажав клавишу Enter, потом введите: help и нажмите Enter для прохождения обучения.

26

Для того чтобы найти домашний каталог в Windows, откройте Vim и введите команду: echo $HOME.

27

Нам нравится Реймонд Хеттингер. Если бы все писали код так, как он рекомендует, мир был бы гораздо лучше.

28

Electron — платформа для создания кросс-платформенных настольных приложений с помощью HTML, CSS и JavaScript.

29

https://github.com/Microso/PTVS/wiki/Features-Matrix.

30

Если вам больше нравится, используйте команду Set-ExecutionPolicy AllSigned.

31

POSIX расшифровывается как Portable Operating System Interface (портируемый интерфейс операционных систем). Включает набор стандартов IEEE, указывающих ОС ее поведение и интерфейс для простых команд оболочки, ввода/вывода, работы с потоками и для других сервисов и утилит. Большая часть дистрибутивов Linux и Unix совместима с POSIX, Darwin (операционная система, лежащая в основе Mac OS X и iOS), была совместима с версии Leopard (10.5). Фраза «система POSIX» означает систему, совместимую с POSIX.

32

Egg — это ZIP-архив с особой структурой. Эти архивы были заменены на архивы wheels в PEP 427 (https://www.python.org/dev/peps/pep-0427/). Были представлены популярной библиотекой упаковки Setuptools (сейчас библиотека по умолчанию), предлагающей полезный интерфейс для distutils (https://docs.python.org/3/library/distutils.html) из стандартной библиотеки Python. Вы можете прочесть об особенностях этих форматов в разделе Wheel vs Egg (https://packaging.python.org/en/latest/wheel_egg/) руководства Python Packaging User.

33

YAML (https://en.wikipedia.org/wiki/YAML) расшифровывается как YAML Ain’t Markup Language — «не просто еще один язык разметки».

34

Виртуальная машина — это приложение, которое эмулирует компьютерную систему путем имитации желаемого аппаратного обеспечения и предоставления требуемой операционной системы для компьютера-хоста.

35

Виртуальная среда внутри контейнера Docker изолирует вашу среду Python, сохраняя версию Python операционной системы, которая может понадобиться для ваших приложений. Поэтому прислушайтесь к нашему совету ничего не устанавливать с помощью pip (или чего-то еще) в системный каталог Python.

36

Цитата изначально приведена Ральфом Уолдо Эмерсоном (Ralph Waldo Emerson) в эссе Self-Reliance. Присутствует в PEP 8 для того, чтобы подтвердить, что здравый смысл важнее руководства по стилю. Например, гармоничный код и существующие соглашения перевесят строгое следование PEP 8.

37

Разность — это утилита оболочки, которая сравнивает два файла и показывает отличающиеся строки.

38

В соответствии с PEP 8 это значение равно 80 символам. Согласно другим источникам — 100, а в вашем случае это значение зависит от того, что говорит ваш начальник. Ха! Честно говоря, любой, кто использовал консоль для отладки кода в полевых условиях, быстро оценит ограничение в 80 символов (при котором строка в консоли не переносится) и на деле будет использовать 75–77, чтобы можно было увидеть нумерацию строк в Vi.

39

Обратитесь к 14-му пункту «Дзена Питона». Гвидо, наш BDFL, — голландец.

40

Кстати, именно поэтому только хэшируемые объекты можно хранить во множествах или использовать как ключи для словарей. Чтобы ваши объекты Python стали хэшируемыми, определите функцию-член object.__hash__(self), которая возвращает целое число.

41

В этом случае метод __exit__() вызовет метод обертки для ввода/вывода close(), чтобы закрыть дескриптор файла. Во многих системах имеется максимальное количество открытых дескрипторов файлов, и хороший тон — освобождать их по завершении работы.

42

Если хотите, можете назвать файл my_spam.py, но даже нашим другом — нижним подчеркиванием — не следует злоупотреблять в именах модулей (нижнее подчеркивание наводит на мысль, что перед вами имя переменной).

43

Благодаря PEP 420 (https://www.python.org/dev/peps/pep-0420/), который был реализован в Python 3.3, существует альтернативный корневой пакет — пакет пространства имен. Такие пакеты не должны содержать файл __init__.py, могут быть разбиты по нескольким каталогам sys.path. Python соберет все фрагменты воедино и представит их пользователю как один пакет.

44

Инструкции по созданию собственных типов с помощью C предоставлены в документации Python по адресу https://docs.python.org/3/extending/newtypes.html.

45

Пример простого алгоритма хэширования — преобразование байтов объекта в целое число и взятие его суммы по какому-нибудь модулю. memcached (http://www.memcached.org/) распределяет ключи между несколькими компьютерами именно так.

46

Должны признать: хотя в PEP 3101 (https://www.python.org/dev/peps/pep-3101/) форматирование с использованием знака % (%s, %d, %f) считается устаревшим, большинство разработчиков старой школы все еще используют его. В PEP 460 (https://www.python.org/dev/peps/pep-0460/) был представлен такой же метод форматирования байтов или объектов bytearray.

47

Обратите внимание, что метод unittest.TestCase.tearDown не будет запущен, если в коде есть ошибки. Это может удивить вас, если вы использовали функциональность unittest.mock для того, чтобы изменить реальное поведение кода. В Python 3.1 был добавлен метод unittest.TestCase.addCleanup(). Он помещает функцию очистки и ее аргументы в стек, и эта функция будет вызвана либо после метода unittest.TestCase.tearDown(), либо в любом случае независимо от того, был ли вызван метод tearDown(). Для получения более подробной информации обратитесь к документации метода unittest.TestCase.addCleanup() (см. http://docs.python.org/3/library/unittest.html#unittest.TestCase.addCleanup).

48

Для тех, кому интересно: развернулась дискуссия о введении поддержки (https://bitbucket.org/pypa/pypi/issues/148/support-markdown-for-readmes) в файлах README в PyPI.

49

Вы можете встретить и другие инструменты вроде Pycco, Ronn, Epydoc (больше не поддерживается) и MkDocs. Практически все используют Sphinx, мы также рекомендуем выбрать его.

50

На момент написания книги они находились под лицензией Academic Free License v.2.1 или Apache License, Version 2.0. Полное описание того, как это работает, вы можете найти на странице https://www.python.org/psf/contrib/.

51

Все лицензии, описанные здесь, одобрены OSI, вы можете узнать о них на главной странице OSI по адресу https://opensource.org/licenses.

52

Аббревиатура tl;dr означает «Too long; didn’t read» («Слишком длинно, не читал») и, скорее всего, существовала как сокращение для редакторов, пока не стала популярной в Интернете.

53

Если вам нужна книга, материал которой основан на десятилетнем опыте чтения и рефакторинга кода, рекомендуем вам Object-Oriented Reengineering Patterns (издательство Square Bracket Associates) (http://scg.unibe.ch/download/oorp/index.html) за авторством Сержа Демейера (Serge Demeyer), Стефана Дюкасса (Stе́phane Ducasse) и Оскара Нирстраса (Oscar Nierstrasz).

54

Демон — это компьютерная программа, которая работает как фоновый процесс.

55

Если вы столкнетесь с проблемой, когда lxml потребует более свежую версию библиотеки libxml2, установите более раннюю версию lxml, введя команду pip uninstall lxml; pip install lxml==3.5.0. Все сработает как надо.

56

Демонизируя процесс, вы создаете его копию, открепляете идентификатор сессии и копируете его снова, поэтому процесс будет полностью отключен от терминала, из которого вы его запускаете. Недемонизированные программы завершают работу при закрытии терминала — возможно, вы видели предупреждающее сообщение «Вы действительно хотите закрыть терминал? Это приведет к завершению запущенных процессов», за которым идет список запущенных в данный момент процессов. Демонизированный процесс продолжит работу после закрытия окна терминала. Он называется демоном в честь демона Максвелла (https://ru.wikipedia.org/wiki/Демон_Максвелла) (умного демона, а не гнусного).

57

В PyCharm вы можете сделать это, выбрав пункты меню PyCharm—>Preferences—>Project: Diamond—>Project Interpreter, а затем указав пути к интерпретатору Python в текущей виртуальной среде.

58

В Python абстрактным считается класс, для которого отдельные методы не определены. Ожидается, что разработчик определит их в подклассе. В абстрактном базовом классе вызов этой функции сгенерирует исключение NotImplementedError. Более современная альтернатива — использовать модуль Python для абстрактных базовых классов (abc) (https://docs.python.org/3/library/abc.html) (впервые реализован в Python 2.6), который сгенерирует ошибку при создании объекта незавершенного класса. Полная спецификация приведена в PEP 3119 (https://www.python.org/dev/peps/pep-3119).

59

Мы перефразировали отличную статью The Difference Between Complicated and Complex Matters (http://bit.ly/complicated-vs-complex) Ларри Кубана (Larry Cuban), заслуженного профессора Стэнфорда.

60

В Python предусмотрен лимит для рекурсии (максимальное количество раз, которое функция может вызвать сама себя) — он по умолчанию значительно ограничивает ваши возможности (существует для того, чтобы предупредить избыточное использование рекурсии). Вы можете узнать значение этого ограничения, введя import sys; sys.getrecursionlimit().

61

Язык программирования имеет функции первого класса, если он рассматривает функции как объекты первого класса. В частности, это означает, что язык поддерживает передачу функций в качестве аргументов другим функциям, возврат их как результат других функций, присваивание их переменным или сохранение в структурах данных.

62

PID расшифровывается как process identifier (идентификатор процесса). Каждый процесс имеет уникальный идентификатор, который доступен в Python благодаря модулю os в стандартной библиотеке: os.getpid().

63

В Python 2 по умолчанию применяется ASCII, в Python 3 — UTF-8. Существует несколько разрешенных способов взаимодействия между кодировками, все они перечислены в PEP 263 (https://www.python.org/dev/peps/pep-0263/). Вы можете использовать тот, который лучше работает в вашем любимом текстовом редакторе.

64

Если вам нужно обновить свои знания о словаре, воспользуйтесь RFC 7231 — документом, содержащим семантику HTTP (http://bit.ly/http-semantics). Если вы просмотрите его содержимое и прочтете введение, то сможете понять, упоминается ли нужное вам определение, и найти его.

65

Они определены в разделе 4.3 текущего рабочего предложения для HTTP (http://bit.ly/http-method-def).

66

Модуль http.cookiejar ранее назывался cookielib в Python 2, urllib.requests.Request ранее назывался urllib2.Request в Python 2.

67

Этот метод позволяет обрабатывать запросы из разных источников (вроде получения библиотеки JavaScript, размещенной на стороннем сайте). Он должен возвращать изначальный хост запроса, определенный в IETF RFC 2965.

68

С тех пор PEP 333 был заменен спецификацией, в которую были добавлены детали, характерные для Python 3, PEP 3333. Для получения вводной информации рекомендуем прочесть руководство по WSGI (http://pythonpaste.org/do-it-yourself-framework.html) Иэна Бикинга (Ian Bicking).

69

re.VERBOSE позволяет писать более читаемые регулярные выражения путем изменения обработки пробелов и добавления комментариев. Подробную информацию вы можете получить из документации к re (https://docs.python.org/3/library/re.html).

70

То есть, если объект можно вызвать, его можно проитерировать или же для него определен правильный метод…

71

Отсылка к Ruby on Rails, популяризовавшему веб-фреймворки, следущие стилю Django «все включено», а не стилю Flask «почти ничего не включено (пока вы не добавите надстройки)». Django — отличный выбор в том случае, если вам нужно именно та функциональность, которую предоставляет Django. Он был создан для поддержки онлайн-газеты (и отлично с этим справляется).

72

WSGI — это стандарт Python, определенный в PEP 333 и PEP 3333, в котором описывается, как приложение может связываться с веб-сервером.

73

В Python стек вызовов содержит исполняемые инструкции, запущенные интерпретатором Python. Поэтому если функция f() вызовет функцию g(), то f() пойдет на стек первой, а g() при вызове будет помещена выше f(). Когда функция g() возвращает значение, она удаляется из стека, и функция f() продолжает работу с того места, где прервалась. Стек называется так потому, что он работает точно так же, как посудомойка, которой требуется вымыть стопку тарелок: новые тарелки помещаются наверх, и вам всегда нужно начинать работу с верхних.

74

Игра слов use force — use source. — Примеч. пер.

75

Ходят слухи (https://www.pypa.io/en/latest/history/#before-2013), что они предпочитают называть себя «министерством установки». Ник Коглан (Nick Coghlan), назначенный BDFL для работы с PEP, связанными с упаковкой, написал в своем блоге содержательную статью о самой системе, ее истории и направлении развития (http://bit.ly/incremental-plans).

76

На данный момент существуют два URL, которые ссылаются на одинаковое содержимое: https://python-packaging-user-guide.readthedocs.org/ и https://packaging.python.org.

77

В данный момент постепенно осуществляется переход от PyPI к Warehouse (https://warehouse.python.org/) (находится на стадии оценки). Мы можем сказать, что изменился пользовательский интерфейс, но не API. Если вам любопытно, Николь Хэррис (Nicole Harris), один из разработчиков PyPA, написала краткое введение к Warehouse (http://whoisnicoleharris.com/warehouse/).

78

Если у вас установлен Python 3.4 или выше, но нет pip, вы можете установить его из командной строки с помощью команды python — m ensurepip.

79

Заморозка кода Python на Linux с его преобразованием для выполнения в ОС Windows применялась в PyInstaller 1.4, но от этой возможности отказались в версии 1.5 (https://github.com/pyinstaller/pyinstaller/wiki/FAQ#features), поскольку она работала только для программ, написанных на чистом Python (то есть не для графических приложений).

80

Как мы увидим при взгляде на другие установщики, сложность заключается не в поиске и объединении в пакеты совместимых библиотек, написанных на C, необходимых для определенной версии библиотеки Python, а в обнаружении периферических файлов конфигурации, спрайтов или особой графики, а также других файлов, которые не обнаруживает инструмент для заморозки при исследовании вашего исходного кода.

81

Некоторые могли слышать, как их называют бинарными пакетами или установщиками; в Python они имеют официальное имя «дистрибутивы», которое означает RPM, пакеты Debian или исполняемые установщики для Windows. Формат wheel также является разновидностью дистрибутива, но по разным причинам, которые рассматриваются в статье, посвященной wheels, зачастую лучше создавать дистрибутивы для отдельных платформ Linux (http://bit.ly/python-on-wheels), как показано в этом разделе.

82

docopt не использует ни optparse, ни argparse и для анализа строк документации применяет регулярные выражения.

83

Tcl (https://www.tcl.tk/about/language.html) (изначально назывался Tool Command Language — командный язык инструментов) — это легковесный язык, созданный Джоном Аустерхаутом (John Ousterhout) (http://web.stanford.edu/~ouster/cgi-bin/tclHistory.php) в начале 1990-х годов для проектирования интегральных цепей.

84

В дополнение к поддержке мыши может обрабатывать прикосновения: TUIO (http://www.tuio.org/) (протокол и API с открытым исходным кодом для обработки прикосновений), Wii remote от Nintendo, WM_TOUCH (API, позволяющий работать с прикосновениями, для Windows), USB-тачскрины, использующие продукты HidTouch (https://sourceforge.net/projects/hidtouchsuite/) от Apple, и др. (https://kivy.org/docs/api-kivy.input.providers.html).

85

GIMP расшифровывается как GNU Image Manipulation Program. GTK+ была создана для рисования с GIMP, но стала достаточно популярна для того, чтобы пользователи захотели создать с ее помощью целую оконную среду (так и появилось название GNOME).

86

Создание Swift (http://www.apple.com/swift/) могло снизить потребность в нем — он практически так же прост, как и Python, поэтому, если вы пишете код для OS X, почему бы просто не воспользоваться Swift и сделать все нативно (за исключением вычислений, для которых придется использовать научные библиотеки вроде NumPy и Pandas)?

87

Он был вдохновлен веб-сервером проекта Twisted (http://twistedmatrix.com/trac/wiki/TwistedWeb), который является частью тулкита Tornado для работы с сетями. Если вы хотите воспользоваться функциональностью, которой нет в Tornado, попробуйте поискать ее в Twisted. Но предупреждаем: новичкам трудно освоить Twisted.

88

На самом деле в документации относительно WSGI сказано следующее: «Используйте WSGIContainer только в том случае, когда преимущества объединения Tornado и WSGI в одном процессе перекрывают сниженную масштабируемость».

89

Разделение обязанностей (https://en.wikipedia.org/wiki/Separation_of_concerns) — это принцип проектирования, который означает, что хороший код является модульным: каждый компонент должен делать что-то одно.

90

Отрисовка редко является узким местом в веб-приложениях (обычно это доступ к данным).

91

Pinax объединяет популярные шаблоны, приложения и инфраструктуру Django, чтобы ускорить запуск проекта Django.

92

Обратный прокси получает информацию от другого сервера от лица клиента и возвращает ее клиенту, как если бы она приходила от обратного прокси.

93

Балансировка нагрузки позволяет оптимизировать производительность путем распределения работы между несколькими вычислительными ресурсами.

94

Wait переводится как «ожидать». — Примеч. пер.

95

Фаулер выступает за использование правил хорошего тона при проектировании ПО. Он один из главных сторонников непрерывной интеграции (http://martinfowler.com/articles/continuousIntegration.html). Эта цитата взята из его статьи о непрерывной интеграции. Он провел серию семинаров, посвященных разработке через тестирование и отношению к экстремальной разработке (http://martinfowler.com/articles/is-tdd-dead/), вместе с Дэвидом Хайнемайером Хэнссоном (David Heinemeier Hansson, создатель Ruby on Rails) и Кентом Бэком (Kent Beck, инициатор движения экстремального программирования (XP), одним из основных принципов которого является непрерывная разработка) (https://en.wikipedia.org/wiki/Extreme_programming).

96

На GitHub другие пользователи оправляют запросы на включения, чтобы оповестить владельцев другого репозитория о том, что у них имеются изменения, которые они хотели бы внести в их проект.

97

REST расшифровывается как representational state transfer — передача состояния представления. Это не стандарт и не протокол, а набор принципов проектирования, разработанных во время создания стандарта HTTP 1.1. Список релевантных архитектурных ограничений для REST доступен в «Википедии»: https://en.wikipedia.org/wiki/Representational_state_transfer#Architectural_constraints.

98

OpenStack предоставляет бесплатное ПО для облачных сетей, хранения и вычислений, поэтому организации могут размещать собственные приватные облака или публичные облака, за доступ к которым нужно платить.

99

За исключением Salt-SSH, который является альтернативной архитектурой Salt (возможно, она была создана как ответ пользователям, желавшим получить версию Salt, более похожую на Ansible).

100

Дэвид Бизли написал отличное руководство (http://www.dabeaz.com/python/UnderstandingGIL.pdf), которое описывает способ работы GIL. Он также рассматривает новую версию GIL (http://www.dabeaz.com/python/NewGIL.pdf), появившуюся в Python 3.2. Результаты показывают, что максимизация производительности в приложении Python требует глубокого понимания GIL, его влияния на приложение, а также знания количества ядер и понимания узких мест приложения.

101

По адресу http://bit.ly/monte-carlo-pi приводится полная реализация метода. По сути, вы бросаете дротики в квадрат размером 2 × 2, а круг имеет радиус = 1. Если дротик может попасть в любое место доски с одинаковой вероятностью, то процент дротиков, попавших в круг, будет равен π / 4. Это означает, что если вы умножите шанс попадания в круг на 4, то получите число π.

102

Язык может быть одновременно строго типизированным и динамически типизированным, это описывается по адресу http://stackoverflow.com/questions/113 28920/.

103

Необходимо особенно тщательно писать расширения на C, чтобы убедиться, что вы регистрируете свои потоки для интерпретатора (http://docs.python.org/c-api/init.html#threads).

104

Стек протоколов TCP/IP (или Internet Protocol) имеет четыре концептуальные части: протоколы канального уровня указывают, как получить информацию от компьютера и Интернета. За их работу отвечают сетевые карты и операционные системы, но не программы Python. Протоколы сетевого уровня (IPv4, IPv6 и т. д.) управляют доставкой пакетов, состоящих из битов, от источника к месту назначения — стандартные варианты предоставлены в библиотеке сокетов для Python (https://docs.python.org/3/library/socket.html). Протоколы транспортного уровня (TCP, UDP и т. д.) указывают, как будут общаться две конечные точки. Возможные варианты также находятся в библиотеке сокетов. Наконец, протоколы прикладного уровня (FTP, HTTP и т. д.) указывают, как должны выглядеть данные для того, чтобы их могло использовать приложение (например, FTP применяется для передачи файлов, а HTTP — для передачи гипертекста) — в стандартной библиотеке Python предоставляются отдельные модули, реализующие наиболее распространенные протоколы.

105

Сокет состоит из трех элементов: IP-адреса, включая номер порта, транспортного протокола (вроде TCP/UDP) и канала ввода/вывода (объект, похожий на файл). В документации к Python приводится отличное введение в тему сокетов (https://docs.python.org/3/howto/sockets.html).

106

Для очереди не требуются IP-адрес или протокол, поскольку она реализуется на одном компьютере; вы просто записываете в нее данные — и другой процесс может их прочитать. Очередь похожа на multiprocessing.Queue, но здесь операции ввода/вывода выполняются асинхронно.

107

Рождение библиотеки cryptography, а также история ее создания описаны в статье Джейка Эджа (Jake Edge) The state of crypto in Python (http://bit.ly/raim-kehrer-talk). cryptography — это низкоуровневая библиотека, предназначенная для импортирования более высокоуровневыми библиотеками вроде pyOpenSSL. Эдж цитирует беседу Джаррета Рэйма (Jarret Raim) и Пола Керера (Paul Kehrer), посвященную State of Crypto in Python (https://www.youtube.com/watch?v=r_Pj__qjBvA), и утверждает, что их набор тестов состоит более чем из 66 000 элементов, которые запускаются 77 раз при каждой сборке.

108

salt — это случайная строка, которая еще больше обфусцирует хэш; если бы все использовали один и тот же алгоритм, nefarious actor смог бы сгенерировать таблицу, содержащую распространенные пароли и их хэши, и применить их для «декодирования» украденных файлов с паролями. Чтобы это предотвратить, к паролю прикрепляется случайная строка (salt), так что ее придется хранить для использования в будущем.

109

Любой человек может подписаться на рассылку cryptography-dev от PyCA, чтобы быть в курсе последних разработок и других новостей. Существует также рассылка новостей OpenSSL.

110

Если вы хотите полностью управлять вашим кодом, отвечающим за шифрование, и вам неважно, что он работает чуть медленнее, и не нужны самые свежие алгоритмы, попробуйте библиотеку TweetNaCl (https://tweetnacl.cr.yp.to/), которая состоит из одного файла и помещается в сотню твитов. Поскольку релиз PyNaCl поставляется вместе с libsodium, вы, скорее всего, можете использовать TweetNaCl и в то же время запускать практически все (правда, мы сами не пробовали так делать).

111

ATLAS — это развивающийся программный проект, который предоставляет протестированные производительные библиотеки для работы с линейной алгеброй. Он предоставляет интерфейсы на языках C и FORTRAN 77 для программ из хорошо известных Basic Linear Algebra Subset (BLAS) и Linear Algebra PACKage (LAPACK).

112

Одним из популярных инструментов, использующим числа Python, является SageMath (http://www.sagemath.org/) — всеобъемлющий инструмент, который определяет классы для представления полей, колец, алгебр и доменов, а также предоставляет символьные инструменты, унаследованные из SymPy, и численные инструменты, унаследованные из NumPy, SciPy и многих других библиотек, написанных как на Python, так и на других языках.

113

В операционной системе Windows на момент написания книги nltk доступен только для Python 2.7. Попробуйте запустить его на Python 3; метки «Python 2.7» могли устареть.

114

Алгоритм Punkt tokenizer создан Тибором Киссом (Tibor Kiss) и Яном Странком (Jan Strunk) в 2006 году (http://bit.ly/kiss-strunk-paper). Представляет собой не зависящий от языка способ определять границы предложения, например конструкция Mrs. Smith and Johann S. Bach listened to Vivaldi будет корректно определена как одно предложение. Алгоритм необходимо обучить на большом наборе данных, но алгоритм для английского языка, используемый по умолчанию, уже обучен.

115

Эти шаги сработали для нас: для начала используйте команду brew install opencv или brew install opencv3 — with-python3. Далее следуйте инструкциям (вроде связывания с NumPy). Наконец, добавьте каталог, содержащий общий файл объекта OpenCV (например, /usr/local/Cellar/opencv3/3.1.0_3/lib/python3.4/site-packages/) к вашему пути; или введите команду add2virtualenvironment (http://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html#add2virtualenv), установленную вместе с библиотекой virtualenvwrapper, если собираетесь использовать библиотеку только в виртуальной среде.

116

Идея реляционных баз данных предложена в 1970 году Эдгаром Ф. Коддом (Edgar F. Codd), работником компании IBM. Он написал статью «A Relational Model of Data for Large Share Data Banks» (http://bit.ly/relational-model-data), которой не интересовались до 1977-го, пока Ларри Эллисон (Larry Ellison) не создал компанию (она в итоге стала компанией Oracle), взявшую за основу эту технологию. Другие идеи-конкуренты вроде хранилища, работающие по принципу «ключ-значение», и иерархические модели баз данных игнорировались после успеха реляционных баз данных. Лишь недавно движение not only SQL (NoSQL) возродило идею использовать нереляционные хранилища для кластерных вычислений.

117

В Python2 это ConfigParser; обратитесь к документации для configparser (https://docs.python.org/3/library/configparser.html#supported-ini-file-structure), чтобы увидеть точный диалект, с которым работает анализатор.

118

Библиотека dbm хранит пары ключ-значение в хэш-таблице, находящейся на диске. Точный механизм ее работы зависит от ее бэкенда — gdbm, ndbm или dumb («глупый»). «Глупый» бэкенд реализован в Python и хорошо задокументирован. Про два других вы можете прочитать в руководстве к gdbm (http://www.gnu.org.ua/software/gdbm/manual//gdbm.html). Для ndbm существует верхняя граница для сохраняемых значений. При открытии файла для записи он блокируется, если (только для gdbm) вы не открываете файл базы данных в режиме ru или wu, и даже тогда обновления могут быть невидимы для других соединений.

119

Несмотря на то что язык структурированных запросов (Structured Query Language, SQL) является стандартом ISO (http://bit.ly/sql-iso-standard), поставщики баз данных сами выбирают, насколько полно его реализовывать, а также могут добавить собственную функциональность. Это означает, что библиотека Python, которая служит драйвером базы данных, должна понимать диалект SQL выбранной вами базы данных.

120

Эти шаблоны определены в книге Мартина Фаулера (Martin Fowler) Patterns of Enterprise Application Architecture (http://www.martinfowler.com/books/eaa.html). Чтобы подробнее узнать о том, из чего состоят ORM проектов Python, рекомендуем прочесть раздел «SQLAlchemy» книги Architecture of Open Source Applications (http://www.aosabook.org/en/sqlalchemy.html), а также взглянуть на список ссылок, связанных с ORM для Python, предоставленный FullStack Python: https://www.fullstackpython.com/object-relational-mappers-orms.html.

121

Метаклассы для Python хорошо объясняются на Stack Overflow.

122

Django Girls (https://djangogirls.org/) — благотворительная организация, в которую входят отличные программисты. Предоставляет возможность бесплатного обучения Django в среде, дружелюбной для женщин всего мира.

123

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

Загрузка...