Как посмотреть содержимое библиотеки python

от admin

Учимся читать код, изучая стандартную библиотеку Python

Итак, вы уже продвинутый новичок — вы изучили основы Python и способны решать реальные задачи.

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

Наверно, вы слышали, что нужно нарабатывать понимание чтением и написанием больших объёмов кода. Это правда.

Но какой же код нужно читать?

«Просто читай то, что нравится». А если вы не знаете, что вам нравится? А если вам не нравится что-то правильное?

Или хуже того — если вам нравится что-то неправильное и из-за этого у вас выработаются вредные привычки?

В конечном итоге, для этого ведь необходимо понимание… Но именно его мы и стремимся обрести.

«На GitHub куча проектов — выберите понравившийся и изучайте, как его реализовали разработчики». Однако самые успешные проекты довольно объёмны — с чего начинать?

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

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

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

В этой статье мы рассмотрим некоторые модули стандартной библиотеки Python.

Примечание о стандартной библиотеке

В целом, стандартная библиотека Python неидеальна для изучения «хорошего» стиля.

Хотя все её модули полезны, они не особо однородны:

  • их писали разные авторы;
  • некоторые из них старые (стиль Python 10-20 лет назад был другим);
  • им нужно было сохранять обратную совместимость (то есть невозможно провести рефакторинг багов и вносить крупные изменения в API).

Мы рассмотрим как раз некоторые из них.

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

Любопытно изучить различия в возможностях stdlib и её новых внешних альтернатив — разница между ними демонстрирует дефицит, который испытывают разработчики (ведь в противном случае они бы не заморачивались созданием альтернативы). Хорошим примером этого является разница между urllib и requests .

Как читать модули

Приблизительно в таком порядке:

  • Познакомьтесь с библиотекой как пользователь: прочитайте документацию, поэкспериментируйте с примерами.
  • Прочитайте соответствующее Python Enhancement Proposal (PEP). Интересное обычно содержится в разделах Abstract, Rationale, Design Decisions, Discussion и Rejected Ideas.
  • Прочитайте код; ссылка на него приведена в начале каждой страницы документации.

statistics

Модуль statistics добавляет в стандартную библиотеку статистические функции; он не создавался в качестве конкурента таких библиотек, как NumPy , а «находится на уровне построителя графиков и научного калькулятора».

Он был внедрён в PEP 450. Если вы незнакомы с этим предложением, то это очень любопытное чтиво:

  • В разделе Rationale предложение сравнивается с NumPy и самодельными решениями; он особенно хорошо демонстрирует, что и почему было добавлено в стандартную библиотеку.
  • Также там есть раздел Design Decisions, в котором объясняется, какой была общая философия проектирования; в разделах Discussion и FAQ тоже есть интересные подробности.

«Большая часть документации предназначена для читателей, понимающих базовые концепции, но которые могут не знать (например), какую дисперсию им стоит использовать [. ] Однако документация избегает скучных математических подробностей».

Код относительно прост, а когда это не так, то в нём есть комментарии и ссылки на подробные объяснения или статьи. Это может быть полезным, если вы изучаете все эти концепции и вам проще читать код, чем математическиe условные обозначения.

pathlib

Модуль pathlib обеспечивает простую иерархию классов для работы с путями файловой системы; он является высокоуровневой альтернативой os.path .

Модуль был внедрён в PEP 428. Большинство примеров используется для иллюстрации лежащей в основе модуля философии, а код оставлен в качестве спецификации.

Код хорошо читается по следующим причинам:

  • Вероятно, вы уже знакомы с этой тематикой; даже если вы не пользовались раньше pathlib , то могли работать с os.path , или с похожей библиотекой в каком-то другом языке.
  • Это хорошее объектно-ориентированное решение. Оно использует объектно-ориентированное программирование с абстрактными (читай: изобретёнными) концепциями, чтобы улучшить структуру кода и его многократное использование. Наверно, это гораздо лучший пример, чем старый Animal​–​Dog​–​Cat​–​Duck​–​speak().
  • Это хорошая тема для сравнительного изучения: pathlib и os.path решают одну задачу, однако в совершенно разных стилях программирования. Кроме того, существовало ещё одно предложение, которое было отклонено, а ещё есть не меньше пяти похожих библиотек; pathlib позаимствовал что-то от каждой из них.

dataclasses

Модуль dataclasses снижает объём бойлерплейта при написании классов, генерируя специальные методы наподобие __init__ и __repr__ . (См. в качестве введения этот туториал, потому что в нём используются гораздо более конкретные примеры, чем в официальной документации.)

Он был внедрён в PEP 557 в качестве упрощённой версии attrs . Раздел Specification схож с документацией; интересные вещи встречаются в Rationale, Discussion и Rejected Ideas.

Кроме того, это отличный пример метапрограммирования; этот аспект подробно рассматривается в докладке Реймонда Хеттингера Dataclasses: The code generator to end all code generators. [Слайды с доклада в HTML и PDF.] Если у вас возникли проблемы с пониманием кода, то сначала посмотрите доклад; для меня оказалось довольно полезным объяснение генерируемого кода.

Бонус: graphlib

Модуль graphlib был добавлен в Python 3.9, и на данный момент содержит только одну вещь: реализацию алгоритма топологической сортировки (вот описание того, что это такое, и почему он полезен).

Он появился не через PEP; однако у него есть issue со множеством комментариев от разных разработчиков ядра, в том числе Реймонда Хеттингера и Тима Питерса (известного своим «Дзен языка Python»).

Так как это, по сути, решённая задача, в обсуждениях рассматривается API: куда его вставлять, кто должен его вызывать, как представлять входные и выходные данные, как одновременно обеспечить простоту использования и гибкость.

В обсуждении пытаются примирить два различных способа использования модуля:

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

По сравнению с обсуждением issue, сам код очень мал — меньше 250 строк, и в основном состоит из комментариев и документации.

На правах рекламы

Серверы для разработчиков и не только! Дешёвые VDS на базе новейшего «железа» для размещения проектов любой сложности, от корпоративных сетей и игровых проектов до лендингов и VPN.

How to list all functions in a module?

I have a Python module installed on my system and I’d like to be able to see what functions/classes/methods are available in it.

I want to call the help function on each one. In Ruby I can do something like ClassName.methods to get a list of all the methods available on that class. Is there something similar in Python?

e.g. something like:

martineau's user avatar

20 Answers 20

You can use dir(module) to see all available methods/attributes. Also check out PyDocs.

camflan's user avatar

Use the inspect module:

Also see the pydoc module, the help() function in the interactive interpreter and the pydoc command-line tool which generates the documentation you are after. You can just give them the class you wish to see the documentation of. They can also generate, for instance, HTML output and write it to disk.

Once you’ve import ed the module, you can just do:

. To get the docs on all the functions at once, interactively. Or you can use:

. To simply list the names of all the functions and variables defined in the module.

Tiago Martins Peres's user avatar

Use inspect.getmembers to get all the variables/classes/functions etc. in a module, and pass in inspect.isfunction as the predicate to get just the functions:

getmembers returns a list of tuples (object_name, object) sorted alphabetically by name.

You can replace isfunction with any of the other isXXX functions in the inspect module.

Christopher Peisert's user avatar

Aran-Fey's user avatar

For completeness’ sake, I’d like to point out that sometimes you may want to parse code instead of importing it. An import will execute top-level expressions, and that could be a problem.

For example, I’m letting users select entry point functions for packages being made with zipapp. Using import and inspect risks running astray code, leading to crashes, help messages being printed out, GUI dialogs popping up and so on.

Instead I use the ast module to list all the top-level functions:

Putting this code in list.py and using itself as input, I get:

Of course, navigating an AST can be tricky sometimes, even for a relatively simple language like Python, because the AST is quite low-level. But if you have a simple and clear use case, it’s both doable and safe.

Though, a downside is that you can’t detect functions that are generated at runtime, like foo = lambda x,y: x*y .

For code that you do not wish to evaluate, I recommend an AST-based approach (like csl’s answer), e.g.:

For everything else, the inspect module is correct:

This gives a list of 2-tuples in the form [(<name:str>, <value:function>), . ] .

The simple answer above is hinted at in various responses and comments, but not called out explicitly.

This will do the trick:

However, if you find it annoying to read the returned list, just use the following loop to get one name per line.

Читать:
Как пользоваться программой contracam

dir(module) is the standard way when using a script or the standard interpreter, as mentioned in most answers.

However with an interactive python shell like IPython you can use tab-completion to get an overview of all objects defined in the module. This is much more convenient, than using a script and print to see what is defined in the module.

  • module.<tab> will show you all objects defined in the module (functions, classes and so on)
  • module.ClassX.<tab> will show you the methods and attributes of a class
  • module.function_xy? or module.ClassX.method_xy? will show you the docstring of that function / method
  • module.function_x?? or module.SomeClass.method_xy?? will show you the source code of the function / method.

For global functions dir() is the command to use (as mentioned in most of these answers), however this lists both public functions and non-public functions together.

For example running:

Returns functions/classes like:

Some of which are not generally meant for general programming use (but by the module itself, except in the case of DunderAliases like __doc__ , __file__ ect). For this reason it may not be useful to list them with the public ones (this is how Python knows what to get when using from module import * ).

__all__ could be used to solve this problem, it returns a list of all the public functions and classes in a module (those that do not start with underscores — _ ). See Can someone explain __all__ in Python? for the use of __all__ .

Here is an example:

All the functions and classes with underscores have been removed, leaving only those that are defined as public and can therefore be used via import * .

Note that __all__ is not always defined. If it is not included then an AttributeError is raised.

Поиск исходного кода для встроенных функций Python?

Есть ли способ увидеть, как встроенные функции работают в python? Я не имею в виду, как их использовать, но также как они были построены, каков код, отсортированный или перечислимый и т.д.

6 ответов

Поскольку Python является открытым исходным кодом, вы можете прочитать исходный код.

Чтобы узнать, какой файл используется в конкретном модуле или функции, вы обычно можете распечатать атрибут __file__ . В качестве альтернативы вы можете использовать модуль inspect , см. Раздел » Извлечение исходного кода» в документации по inspect .

Для встроенных классов и методов это не так просто, поскольку inspect.getfile и inspect.getsource возвращают ошибку типа, inspect.getsource , что объект встроен. Тем не менее, многие из встроенных типов можно найти в подкаталоге Objects соединительной линии Python. Например, см. Здесь для реализации класса enumerate или здесь для реализации типа list .

Вот ответ поваренной книги, чтобы дополнить ответ @Chris, CPython переместился в GitHub, и репозиторий Mercurial больше не будет обновляться:

    При необходимости установите Git.

git clone https://github.com/python/cpython.git

Код будет cpython в подкаталоге cpython → cd cpython

iPython оболочка делает это проще: function? предоставит вам документацию. function?? показывает также код. НО это работает только для чистых функций python.

Тогда вы всегда можете download исходный код для (c) Python.

Если вы заинтересованы в реализации pythonic основных функций, посмотрите PyPy.

Изображение 114534

Мне пришлось немного подражать, чтобы найти источник следующих Built-in Functions поскольку поиск даст тысячи результатов. (Удачи в поиске любого из них, чтобы найти, где это источник)

Во всяком случае, все эти функции определены в bltinmodule.c Функции начинаются с builtin_

Rukovodstvo

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

Справочная система Python

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

Время чтения: 10 мин.

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

В этой статье вы узнаете, как пользоваться встроенной справочной системой Python.

Функция Python help ()

Эта функция помогает нам получить документацию по определенному классу, функции, переменной, модулю и т. Д. Функцию следует использовать в консоли Python для получения сведений о различных объектах Python.

Передача объекта в функцию help ()

Функция Python help() имеет следующий синтаксис:

В приведенном выше синтаксисе object — это имя объекта, по которому вам нужно получить справку.

Например, чтобы узнать больше о print Python, введите следующую команду в консоли Python:

Выход:

Чтобы получить справку по dict , введите в консоли Python следующее:

Выход:

Вы также можете передать фактический объект списка в функцию help()

Выход:

Мы видим, что когда вы передаете объект в help() , печатается его документация или страница справки. В следующем разделе вы узнаете о передаче строковых аргументов функции help() .

Передача строкового аргумента в help ()

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

Выход:

Хотя мы передали print как строковый аргумент, мы все же получили документацию для функции print Вот еще один пример:

Выход:

Здесь мы передали def в качестве строкового аргумента функции help() и она вернула документацию для определения функций.

Если подходящего объекта, метода, функции, класса или модуля не найдено, вы получите уведомление. Например:

Выход:

Нам сообщают, что для нашей строки не найдено документации.

Иногда нам может потребоваться помощь по определенной функции, которая определена в определенной библиотеке Python. Для этого необходимо сначала импортировать библиотеку. Хороший пример — когда нам нужно получить документацию для log определенной в math библиотеке Python. В этом случае нам сначала нужно импортировать math библиотеку, а затем мы вызываем help() как показано ниже:

Выход:

Использование help () без аргументов

help() можно использовать без аргумента. Если вы запустите функцию без аргумента, интерактивная справочная утилита Python будет запущена на консоли интерпретатора. Вам просто нужно ввести следующую команду в консоли Python:

Это вернет утилиту справки Python, в которой вы можете ввести имя объекта, по которому вам нужна помощь. Например:

Выход:

Чтобы вернуться к предыдущему запросу, просто нажмите «q».

Вот еще один пример:

Выход:

Чтобы выйти из утилиты справки и вернуться в консоль Python, просто введите «quit» и нажмите клавишу ввода:

Выход:

В следующем разделе мы обсудим, как определить help() для наших настраиваемых объектов.

Определение справочной документации для пользовательских функций и классов

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

В приведенном выше примере мы определили функцию с именем product . Эта функция умножает два целых числа a и b переданные ей в качестве аргументов / параметров. См. Комментарий, заключенный в три двойные кавычки:

Это будет рассматриваться как строка документации для функционального product .

Теперь создайте новый файл и дайте ему имя myfile.py. Добавьте в файл следующий код:

В приведенном выше примере строка документации была определена для функции, класса и методов.

Теперь нам нужно продемонстрировать, как мы можем получить указанную выше строку документации в качестве справочной документации на нашей консоли Python.

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

В качестве альтернативы, если вы написали код в Python IDLE, вам просто нужно запустить его.

Теперь мы можем подтвердить, были ли обнаружены модули функций и классов, запустив команду globals() в консоли Python:

В моем случае я получаю следующий результат:

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

Выход:

Давайте проверим справочную документацию по функциям product

Выход:

Теперь позвольте нам получить доступ к справочной документации для класса Student

Выход:

На выходе мы видим документацию, которую мы написали для класса Student

Заключение

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

Похожие статьи