Как перечислить все функции в модуле Python?

У меня есть модуль python, установленный в моей системе, и я хотел бы видеть, какие функции / classы / методы доступны в нем.

Я хочу вызвать функцию doc для каждого из них. В ruby ​​я могу сделать что-то вроде ClassName.methods, чтобы получить список всех методов, доступных для этого classа. Есть что-то подобное в python?

например. что-то вроде:

from somemodule import foo print foo.methods # or whatever is the correct method to call 

Модуль проверки. Также см. Модуль pydoc , функцию help() в интерактивном интерпретаторе и pydoc командной строки pydoc который генерирует документацию, которую вы используете. Вы можете просто дать им class, который вы хотите увидеть в документации. Они также могут генерировать, например, вывод HTML и записывать его на диск.

Вы можете использовать dir(module) чтобы просмотреть все доступные методы / атрибуты. Также проверьте PyDocs.

Когда вы import модуль, вы можете просто сделать:

  help(modulename) 

… Чтобы получить документы по всем функциям сразу, интерактивно. Или вы можете использовать:

  dir(modulename) 

… Просто перечислить имена всех функций и переменных, определенных в модуле.

 import types import yourmodule print([getattr(yourmodule, a) for a in dir(yourmodule) if isinstance(getattr(yourmodule, a), types.FunctionType)]) 

Пример с проверкой:

 from inspect import getmembers, isfunction from my_project import my_module functions_list = [o for o in getmembers(my_module) if isfunction(o[1])] 

getmembers возвращает список (object_name, object_type) кортежей.

Вы можете заменить isfunction любой из других isXXX-функций в модуле проверки.

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

Например, я разрешаю пользователям выбирать функции точки входа для пакетов, создаваемых с помощью zipapp . Используя import и inspect риски, связанные с запущенным кодом, приводящие к сбоям, распечатываются справочные сообщения, появляются диалоговые windows графического интерфейса и т. Д.

Вместо этого я использую модуль ast для enums всех функций верхнего уровня:

 import ast import sys def top_level_functions(body): return (f for f in body if isinstance(f, ast.FunctionDef)) def parse_ast(filename): with open(filename, "rt") as file: return ast.parse(file.read(), filename=filename) if __name__ == "__main__": for filename in sys.argv[1:]: print(filename) tree = parse_ast(filename) for func in top_level_functions(tree.body): print(" %s" % func.name) 

Поместив этот код в list.py и используя его как вход, я получаю:

 $ python list.py list.py list.py top_level_functions parse_ast 

Конечно, переход на АСТ может быть сложным иногда даже для относительно простого языка, такого как Python, потому что AST довольно низкоуровневый. Но если у вас есть простой и понятный вариант использования, он является выполнимым и безопасным.

Хотя недостатком является то, что вы не можете обнаружить функции, которые генерируются во время выполнения, например foo = lambda x,y: x*y .

Это сделает трюк:

 dir(module) 

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

 for i in dir(module): print i 

dir(module) является стандартным способом при использовании сценария или стандартного интерпретатора, как указано в большинстве ответов.

Однако с помощью интерактивной оболочки python, такой как IPython, вы можете использовать табуляцию, чтобы получить обзор всех объектов, определенных в модуле. Это гораздо удобнее, чем использование сценария и print чтобы узнать, что определено в модуле.

  • module. покажет вам все объекты, определенные в модуле (функции, classы и т. д.),
  • module.ClassX. покажет вам методы и атрибуты classа
  • module.function_xy? или module.ClassX.method_xy? покажет вам docstring этой функции / метода
  • module.function_x?? или module.SomeClass.method_xy?? покажет вам исходный код функции / метода.

Для кода, который вы не хотите анализировать, я рекомендую использовать метод @csl, основанный на AST.

Для всего остального модуль проверки правилен:

 import inspect import  as module functions = inspect.getmembers(module, inspect.isfunction) 

Это дает список 2-кортежей в форме [(, ), ...] .

Простой ответ выше намечен в различных ответах и ​​комментариях, но не вызывается явно.

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

Например, запуск:

 >>> import re >>> dir(re) 

Возвращает функции / classы:

 '__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx' 

Некоторые из них обычно не предназначены для общего программирования (но самим модулем, за исключением случаев DunderAliases, таких как __doc__ , __file__ ect). По этой причине может оказаться непригодным перечислить их публичными (это то, как Python знает, что получить при использовании from module import * ).

__all__ может быть использован для решения этой проблемы, он возвращает список всех открытых функций и classов в модуле (те, которые не начинаются с подчеркивания – _ ). См. Может ли кто-нибудь объяснить __all__ в Python? для использования __all__ .

Вот пример:

 >>> import re >>> re.__all__ ['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE'] >>> 

Все функции и classы с подчеркиваниями были удалены, оставив только те, которые определены как общедоступные и поэтому могут быть использованы через import * .

Обратите внимание, что __all__ не всегда определяется. Если он не включен, возникает AttributeError .

Случай этого с модулем ast:

 >>> import ast >>> ast.__all__ Traceback (most recent call last): File "", line 1, in  AttributeError: module 'ast' has no attribute '__all__' >>> 

Ни один из этих ответов не будет работать, если вы не сможете импортировать указанный файл Python без ошибок импорта. Это было для меня, когда я просматривал файл, который исходит из большой базы кода с большим количеством зависимостей. Следующее будет обрабатывать файл как текст и искать все имена методов, начинающиеся с «def», и печатать их и их номера строк.

 import re pattern = re.compile("def (.*)\(") for i, line in enumerate(open('Example.py')): for match in re.finditer(pattern, line): print '%s: %s' % (i+1, match.groups()[0]) 

Кроме dir (module) или справки (модуля), упомянутых в предыдущих ответах, вы также можете попробовать:
– Открыть ipython
– import module_name
– введите имя модуля, нажмите вкладку. Он откроет небольшое окно со списком всех функций в модуле python.
Это выглядит очень аккуратно.

Вот fragment, в котором перечислены все функции модуля hashlib

 (C:\Program Files\Anaconda2) C:\Users\lenovo>ipython Python 2.7.12 |Anaconda 4.2.0 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)] Type "copyright", "credits" or "license" for more information. IPython 5.1.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: import hashlib In [2]: hashlib. hashlib.algorithms hashlib.new hashlib.sha256 hashlib.algorithms_available hashlib.pbkdf2_hmac hashlib.sha384 hashlib.algorithms_guaranteed hashlib.sha1 hashlib.sha512 hashlib.md5 hashlib.sha224 

Вы можете использовать следующий метод, чтобы получить список всех функций в вашем модуле из оболочки:

import module

 module.*? 

Это не (или, по крайней мере, не более) правильно использовать dir (модуль). Код должен выглядеть следующим образом:

 dir('module') or dir('modules') 

Или вы указываете модуль, который вы хотите: dir('sys') для получения результатов от имени модуля sys. dir() возвращает ошибки, а dir('') – это то, что вам нужно. * help (”) возвращает справочную информацию, если доступна для большинства функций. например; help('modules') вернет информацию о помощи модуля.

Спасибо за все поданные голоса. Я использовал Python3.2.2 и другие версии 3x, когда я разместил это. Дело было в том, чтобы использовать («материал») вместо предыдущего (материал). Но я предполагаю, что вы все застряли на Python2 или используете более новые версии для ПК, не такие мобильные, как я.

http://effbot.org/librarybook/sys.htm

  • В чем разница между a.getClass () и A.class в Java?
  • Как получить все экземпляры всех загруженных типов, реализующих данный интерфейс?
  • Как найти все classы, реализующие данный интерфейс?
  • Получить строковое имя свойства, используя reflection
  • Поиск параметров типа через reflection в Scala 2.10?
  • Почему C ++ не имеет отражения?
  • Gson TypeToken с динамическим типом ArrayList
  • Имя динамической таблицы в linq
  • Почему отраженный доступ к защищенному / частному члену classа в C #?
  • Загрузка DLL-файлов во время выполнения в C #
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Давайте будем гением компьютера.