Б41 Чистый Python. Тонкости программирования для профи. Спб.: Питер



Download 6,94 Mb.
Pdf ko'rish
bet76/80
Sana24.02.2022
Hajmi6,94 Mb.
#212875
1   ...   72   73   74   75   76   77   78   79   80
Bog'liq
978544610803 Chisty Python Tonko

TypeError: "keys must be a string"
Еще один недостаток использования функции 
json.dumps()
состоит 
в том, что она не способна сериализовать составные типы данных, такие 
как множества:
>>> mapping['d'] = {1, 2, 3} 
>>> json.dumps(mapping) 
TypeError: "set([1, 2, 3]) is not JSON serializable"
Кроме того, вы можете столкнуться с такой проблемой, как представление 
текста в кодировке Юникод, — в некоторых случаях вы не сможете взять 
результат на выходе из 
json.dumps
и скопипастить его в сеансе интерпре-
татора Python, чтобы реконструировать первоначальный объект-словарь.
Классическим решением задачи структурной печати объектов Python 
является встроенный модуль 
pprint
. Приведем пример:
>>> import pprint 
>>> pprint.pprint(mapping) 
{'a': 23, 'b': 42, 'c': 12648430, 'd': set([1, 2, 3])}


7 .6 . Структурная печать словаря 265
Вы видите, что функция 
pprint
способна печатать такие типы данных, 
как множества, и она также печатает ключи словаря в воспроизводимом 
порядке. По сравнению со стандартным строковым представлением сло-
варей, здесь мы получаем то, что воспринимается значительно легче.
Вместе с тем, по сравнению с 
json.dumps()
, она не представляет вло-
женные структуры визуально столь же хорошо. В зависимости от об-
стоятельств это может быть преимуществом или недостатком. Я иногда 
использую 
json.dumps()
, чтобы выводить словари из-за улучшенной 
удобочитаемости и форматирования, но только если я уверен, что в них 
нет непримитивных типов данных.
Ключевые выводы
‰
‰
В Python принятое по умолчанию преобразование объектов-словарей 
в строковое представление может оказаться трудночитаемым.
‰
‰
Модули 
pprint
и 
json
представляют собой варианты «более высокого 
качества», встроенные в стандартную библиотеку Python.
‰
‰
Будьте осторожны с использованием функции 
json.dumps()
и непри-
митивных ключей и значений, поскольку это вызовет исключение 
TypeError
.


8
Питоновские методы
повышения 
производительности
8 .1 . Исследование модулей и объектов Python
Вы можете в интерактивном режиме исследовать модули и объекты не-
посредственно из интерпретатора Python. Это недооцененное функцио-
нальное средство легко упустить из виду, особенно если вы переходите на 
Python с другого языка.
Многие языки программирования затрудняют инспектирование пакета 
или класса без сверки с онлайн-документацией или заучивания опреде-
лений интерфейсов наизусть.
В Python дела обстоят по-другому — эффективный разработчик будет 
проводить массу времени в сеансах интерпретатора REPL, работая ин-
терактивно с интерпретатором Python. Например, я часто это делаю для 
разработки коротких фрагментов кода и логики, после чего копирую их 
и вставляю в файл Python, с которым я работаю в своем редакторе.
В этой главе вы познакомитесь с двумя простыми приемами, которые 
можно использовать для исследования классов и методов Python инте-
рактивно, находясь внутри интерпретатора.
Эти приемы будут работать с любой версией Python — надо лишь за-
пустить интерпретатор Python командой 
python
из командной строки 
и приступить к работе. Интерпретатор прекрасно подойдет для сеансов 
отладки в системах, где, например, у вас нет доступа к причудливому 


8 .1 . Исследование модулей и объектов Python 267
редактору или IDE, потому что вы работаете по Сети в терминальном 
сеансе.
Готовы? Поехали! Представьте, что вы пишете программу, которая ис-
пользует модуль Python 
datetime
стандартной библиотеки. Как узнать, 
какие функции или классы этот модуль экспортирует и какие методы 
и атрибуты находятся в его классах?
Один из способов заключается в том, чтобы обратиться за советом к по-
исковой системе или заглянуть в официальную документацию Python 
в Сети. Однако встроенная в Python функция 
dir()
позволяет вам полу-
чать доступ к этой информации непосредственно из Python REPL:
>>> import datetime 
>>> dir(datetime) 
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__',
'__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', '_divide_and_round',
'date', 'datetime', 'datetime_CAPI', 'time',
'timedelta', 'timezone', 'tzinfo']
В приведенном выше примере я сначала импортировал модуль 
datetime
из стандартной библиотеки, а затем проинспектировал его функцией 
dir()
. Вызов 
dir()
с модулем в качестве аргумента выдаст расположен-
ный в алфавитном порядке список имен и атрибутов, которые этот модуль 
предоставляет.
Поскольку в Python абсолютно «все» является объектом, тот же самый 
прием будет работать не только с модулями как таковыми, но и с классами 
и структурами данных, экспортируемыми этим модулем.
В действительности можно продолжить углубляться в подробности модуля, 
снова вызывая 
dir()
с отдельными объектами, которые вызывают интерес. 
Например, ниже показано, как инспектируется класс 
datetime.date
:
>>> dir(datetime.date) 
['__add__', '__class__', ..., 'day', 'fromordinal',
'isocalendar', 'isoformat', 'isoweekday', 'max',
'min', 'month', 'replace', 'resolution', 'strftime',
'timetuple', 'today', 'toordinal', 'weekday', 'year']


268 Глава 8 • Питоновские методы повышения производительности 
Как видите, функция 
dir()
дает вам краткий обзор того, что доступно 
в модуле или классе. Если вы не помните точного написания конкретного 
класса или функции, то, возможно, это все, что вам нужно, чтобы продол-
жать работу, не прерывая процесс программирования.
Иногда вызов функции 
dir()
с объектом в качестве аргумента выдаст 
слишком много информации — составной модуль или класс вызовет 
длинную распечатку, которую трудно быстро прочитать. Ниже приведен 
небольшой трюк, который можно применять для сведения списка атри-
бутов к тем, которыми вы интересуетесь:
>>> [_ for _ in dir(datetime) if 'date' in _.lower()] 
['date', 'datetime', 'datetime_CAPI']
Здесь я использовал конструкцию включения в список для фильтрации 
результатов вызова 
dir(datetime)
, чтобы получить только имена, которые 
включают слово «date». Обратите внимание на то, как я вызывал метод 
lower()
с каждым именем, тем самым гарантируя, что фильтрация будет 
нечувствительна к регистру.
Получение сырого списка атрибутов объекта не всегда обеспечивает нас 
достаточной информацией, необходимой для решения текущей задачи. 
Тогда каким образом можно получить больше информации и более под-
робные описания функций и классов, экспортируемых модулем 
datetime
?
В этом случае вам поможет встроенная в Python функция 
help()
. С ее по-
мощью вы можете вызывать интерактивную справочную систему Python 
и просматривать автоматически сгенерированную документацию Python 
по любому объекту:
>>> help(datetime)
Если выполнить приведенный выше пример в сеансе интерпретатора 
Python, то ваш терминал покажет текстоориентированный экран справки 
для модуля 
datetime
, который будет выглядеть примерно так:
Help on module datetime: 
NAME
datetime — Fast implementation of the datetime type. 


8 .1 . Исследование модулей и объектов Python 269
CLASSES
builtins.object
date
datetime
time
Вы можете использовать клавиши «курсор вверх» и «курсор вниз», чтобы 
прокрутить документацию на экране. Как вариант, также можно нажимать 
клавишу «пробел», чтобы прокручивать вниз сразу несколько строк. Что-
бы выйти из режима интерактивной справки, нужно нажать клавишу 
q

Это вернет вас назад к командной строке интерпретатора. Неплохая воз-
можность, да?
Между прочим, вы можете вызывать 
help()
с произвольными объектами 
Python, включая другие встроенные функции и ваши собственные классы 
Python. Интерпретатор Python автоматически сгенерирует эту докумен-
тацию на основе атрибутов, определенных в объекте, и его строки доку-
ментации docstring (при ее наличии). Все приведенные ниже примеры 
являются допустимыми применениями функции 
help
:
>>> help(datetime.date) 
>>> help(datetime.date.fromtimestamp) 
>>> help(dir) 
Разумеется, функции 
dir()
и 
help()
не заменят собой красиво отформа-
тированную HTML-документацию, мощь поисковой системы или поиск 
на сайте Stack Overflow. Но они являются великолепными инструментами 
для оперативной сверки, не требующим от вас переключения с интерпре-
татора Python. Они также доступны вне Сети и работают без подключе-
ния к интернету, что может оказаться очень полезным в случае крайней 
необходимости.
Ключевые выводы
‰
‰
Используйте встроенную функцию 
dir()
, чтобы интерактивно исследо-
вать модули и классы Python, находясь внутри сеанса интерпретатора.
‰
‰
Встроенная функция 
help()
позволяет просматривать документацию 
прямо из вашего интерпретатора (для выхода нажмите клавишу 
q
).


270 Глава 8 • Питоновские методы повышения производительности 
8 .2 . Изоляция зависимостей проекта 
при помощи Virtualenv
Python содержит мощную систему управления пакетами, позволяющую 
управлять модулями, от которых зависят ваши программы. Вы, вероятно, 
ее использовали, когда устанавливали сторонние пакеты при помощи 
команды менеджера пакетов 
pip
.
Сбивающим с толку аспектом установки пакетов при помощи 
pip
являет-
ся то, что он по умолчанию пытается устанавливать их в вашу глобальную 
среду Python.
Несомненно, это делает любые устанавливаемые вами новые пакеты 
доступными в вашей системе глобально, что очень удобно. Но это также 
быстро превращается в кошмар, если вы работаете с многочисленными 
проектами, которые требуют разных версий того же самого пакета.
Что, если один из ваших проектов нуждается в версии 1.3 библиотеки, 
в то время как для другого проекта нужна версия 1.4 той же самой би-
блиотеки?
Когда вы устанавливаете пакеты глобально, может существовать только 
одна версия библиотеки Python для всех ваших программ. Это означает, 
что вы быстро столкнетесь с конфликтами версий — как Горец, который 
должен остаться только один.
И чем дальше, тем хуже. У вас также могут быть разные программы, для 
которых нужны различные версии самого языка Python. Например, неко-
торые программы могут по-прежнему выполняться в Python 2, в то время 
как основная часть вашей новой разработки происходит в Python 3. Или 
что, если для одного из ваших проектов нужен Python 3.3, в то время как 
все остальное работает в Python 3.6?
Помимо этого, глобальная установка пакетов Python также может стать 
фактором риска с точки зрения обеспечения безопасности. Для модифи-
кации глобальной среды нередко требуется, чтобы вы выполняли коман-
ды 
pip
install
с правами суперпользователя (root-, или админ-правами). 
Когда вы устанавливаете новый пакет, менеджер пакетов 
pip
скачивает 
и исполняет код из интернета, а это обычно не рекомендуется. Хотелось 


8 .2 . Изоляция зависимостей проекта при помощи Virtualenv 271
бы надеяться, что устанавливаемый программный код заслуживает до-
верия, но кто его знает, что он делает на самом деле…
Виртуальные среды спешат на помощь
Решение этих проблем заключается в том, чтобы отделить вашу среду 
Python так называемыми виртуальными средами (virtual environment). 
Они позволяют вам отделять зависимости Python на основе того или ино-
го проекта и предоставляют возможность выбирать между различными 
версиями интерпретатора Python.

Download 6,94 Mb.

Do'stlaringiz bilan baham:
1   ...   72   73   74   75   76   77   78   79   80




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish