Как перечислить все функции в модуле Python?
-
02-07-2019 - |
Вопрос
У меня есть модуль python, установленный в моей системе, и я хотел бы иметь возможность видеть, какие функции / классы / методы доступны в нем.
Я хочу вызвать функцию doc для каждого из них.В ruby я могу сделать что-то вроде className.methods, чтобы получить список всех методов, доступных в этом классе.Есть ли что-то подобное в python?
например.что -то вроде:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
Решение
Тот Самый inspect
модуль.Также смотрите pydoc
модуль, the help()
функция в интерактивном интерпретаторе и pydoc
инструмент командной строки, который генерирует необходимую вам документацию.Вы можете просто предоставить им класс, документацию по которому вы хотите просмотреть.Они также могут генерировать, например, выходные данные HTML и записывать их на диск.
Другие советы
Вы можете использовать dir(module)
чтобы просмотреть все доступные методы / атрибуты.Также ознакомьтесь с PyDocs.
Как только вы import
отредактировав модуль, вы можете просто сделать:
help(modulename)
...Чтобы получить документы по всем функциям сразу, в интерактивном режиме.Или вы можете использовать:
dir(modulename)
...Просто перечислить имена всех функций и переменных, определенных в модуле.
Пример с проверкой:
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 возвращает список кортежей (имя_объекта, объект_тип).
Вы можете заменить isfunction любой из других функций isXXX в модуле inspect.
import types
import yourmodule
print([getattr(yourmodule, a) for a in dir(yourmodule)
if isinstance(getattr(yourmodule, a), types.FunctionType)])
Для полноты картины я хотел бы отметить, что иногда вам может понадобиться анализировать код вместо того, чтобы импортировать его.Ан import
будет выполнить выражения верхнего уровня, и это может быть проблемой.
Например, я разрешаю пользователям выбирать функции точки входа для пакетов, создаваемых с помощью zipapp.Используя import
и inspect
существует риск неправильного запуска кода, что приведет к сбоям, распечатке справочных сообщений, появлению диалоговых окон GUI и так далее.
Вместо этого я использую аст модуль для перечисления всех функций верхнего уровня:
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
Конечно, навигация по AST иногда может быть сложной, даже для относительно простого языка, такого как Python, потому что AST довольно низкоуровневый.Но если у вас есть простой и понятный вариант использования, это выполнимо и безопасно.
Однако недостатком является то, что вы не можете обнаружить функции, которые генерируются во время выполнения, например foo = lambda x,y: x*y
.
Это сделает свое дело:
dir(module)
Однако, если вас раздражает чтение возвращаемого списка, просто используйте следующий цикл, чтобы получить по одному имени в строке.
for i in dir(module): print i
dir(module)
это стандартный способ при использовании скрипта или стандартного интерпретатора, как упоминалось в большинстве ответов.
Однако с интерактивной оболочкой python, такой как IPython вы можете использовать вкладку-завершение, чтобы получить обзор всех объектов, определенных в модуле.Это гораздо удобнее, чем использовать скрипт и print
чтобы посмотреть, что определено в модуле.
module.<tab>
покажет вам все объекты, определенные в модуле (функции, классы и так далее).module.ClassX.<tab>
покажет вам методы и атрибуты классаmodule.function_xy?
илиmodule.ClassX.method_xy?
покажет вам строку документации этой функции / методаmodule.function_x??
илиmodule.SomeClass.method_xy??
я покажу вам исходный код функции / метода.
Для кода, который вы не хотите анализировать, я рекомендую основанный на AST подход @csl, описанный выше.
Для всего остального модуль проверки корректен:
import inspect
import <module_to_inspect> as module
functions = inspect.getmembers(module, inspect.isfunction)
Это дает список из 2-х кортежей в виде [(<name:str>, <value:function>), ...]
.
Простой ответ, приведенный выше, намекается в различных ответах и комментариях, но не озвучивается явно.
Для глобальных функций dir()
это команда для использования (как упоминалось в большинстве этих ответов), однако в ней перечислены как общедоступные, так и непубличные функции вместе.
Например , запуск:
>>> import re
>>> dir(re)
Возвращает функции / классы, такие как:
'__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx'
Некоторые из которых обычно не предназначены для общего использования в программировании (но самим модулем, за исключением случаев DunderAliases, таких как __doc__
, __file__
эст).По этой причине может оказаться бесполезным перечислять их вместе с общедоступными (именно так Python знает, что получить при использовании from module import *
).
__all__
может быть использован для решения этой проблемы, он возвращает список всех общедоступных функций и классов в модуле (тех, которые не делайте этого начинайте с подчеркивания - _
).Видишь
Кто-нибудь может объяснить __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']
>>>
Все функции и классы с подчеркиванием были удалены, остались только те, которые определены как общедоступные и поэтому могут быть использованы через import *
.
Обратите внимание , что __all__
не всегда определяется.Если он не включен, то AttributeError
повышается.
Примером этого является модуль ast:
>>> import ast
>>> ast.__all__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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) или help (module), упомянутых в предыдущих ответах, вы также можете попробовать:
- Открыть ipython
- импортировать имя_модуля
- введите module_name, нажмите tab.Откроется небольшое окно со списком всех функций модуля python.
Это выглядит очень аккуратно.
Вот фрагмент, в котором перечислены все функции модуля 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.*?
Это добавит все функции, которые определены в your_module, в список.
result=[]
for i in dir(unit8_conversion_methods):
if type(getattr(your_module, i)).__name__ == "function":
result.append(getattr(your_module, i))
Использовать dir(модуль) нецелесообразно (или, по крайней мере, больше не подходит).Код должен выглядеть примерно так:
dir('module') or dir('modules')
Или вы указываете нужный вам модуль следующим образом: dir('sys')
для получения результатов используйте имя модуля sys. dir()
возвращает ошибки при dir('')
это то, что вам нужно.*help(") вернет справочную информацию, если она доступна для большинства функций.например; help('modules')
вернет справочную информацию по модулю.
Спасибо за все голоса "против".Я использовал Python3.2.2 и другие версии 3x, когда публиковал это.Смысл состоял в том, чтобы использовать ('stuff ') вместо предыдущего (stuff).Но я предполагаю, что вы все застряли на Python2 или используете более новые версии для ПК, а не для мобильных устройств, как я.