Как перечислить все функции в модуле Python?
У меня есть модуль python, установленный в моей системе, и я хотел бы видеть, какие функции/классы/методы доступны в нем.
Я хочу вызвать функцию doc для каждого из них. В ruby я могу сделать что-то вроде ClassName.methods, чтобы получить список всех методов, доступных для этого класса. Есть что-то подобное в python?
например. что-то вроде:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
Ответы
Ответ 1
inspect
модуль. Также см. Модуль pydoc
, функцию help()
в интерактивном интерпретаторе и pydoc
командной строки pydoc
который генерирует необходимую документацию. Вы можете просто дать им класс, который вы хотите увидеть в документации. Они также могут генерировать, например, вывод HTML и записывать его на диск.
Ответ 2
Вы можете использовать dir(module)
для просмотра всех доступных методов/атрибутов. Также проверьте PyDocs.
Ответ 3
Как только вы import
редактируете модуль, вы можете просто сделать:
help(modulename)
... Чтобы получить документы по всем функциям сразу, интерактивно. Или вы можете использовать:
dir(modulename)
... Просто перечислите имена всех функций и переменных, определенных в модуле.
Ответ 4
Пример с проверкой:
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 в проверяемом модуле.
Ответ 5
import types
import yourmodule
print([getattr(yourmodule, a) for a in dir(yourmodule)
if isinstance(getattr(yourmodule, a), types.FunctionType)])
Ответ 6
Для полноты, я хотел бы указать, что иногда вам может понадобиться проанализировать код, а не импортировать его. import
будет выполнять выражения верхнего уровня, и это может быть проблемой.
Например, я разрешаю пользователям выбирать функции точки входа для пакетов, созданных с помощью zipapp. Используя import
и inspect
, вы рискуете запутать запущенный код, что приведет к сбоям, распечаткам справочных сообщений, появлению диалоговых окон графического интерфейса и т.д.
Вместо этого я использую модуль ast для перечисления всех функций верхнего уровня:
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
.
Ответ 7
Это сделает трюк:
dir(module)
Однако, если вы считаете, что это раздражает чтение возвращаемого списка, просто используйте следующий цикл, чтобы получить одно имя в строке.
for i in dir(module): print i
Ответ 8
dir(module)
является стандартным способом использования script или стандартного интерпретатора, как указано в большинстве ответов.
Однако с помощью интерактивной оболочки python, например IPython, вы можете использовать табуляцию, чтобы получить обзор всех объектов, определенных в модуле.
Это гораздо удобнее, чем использование script и print
, чтобы узнать, что определено в модуле.
-
module.<tab>
покажет вам все объекты, определенные в модуле (функции, классы и т.д.)
-
module.ClassX.<tab>
покажет вам методы и атрибуты класса
-
module.function_xy?
или module.ClassX.method_xy?
покажет вам docstring этой функции/метода
-
module.function_x??
или module.SomeClass.method_xy??
покажет вам исходный код функции/метода.
Ответ 9
Для кода, который вы не хотите анализировать, я рекомендую использовать метод @csl, основанный на AST.
Для всего остального модуль проверки правилен:
import inspect
import <module_to_inspect> as module
functions = inspect.getmembers(module, inspect.isfunction)
Это дает список 2-кортежей в форме [(<name:str>, <value:function>), ...]
.
Простой ответ выше намечен на различные ответы и комментарии, но не вызывается явно.
Ответ 10
Для глобальных функций 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__'
>>>
Ответ 11
Ни один из этих ответов не будет работать, если вы не сможете импортировать указанный файл 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])
Ответ 12
За исключением dir (module) или help (module), упомянутого в предыдущих ответах, вы также можете попробовать:
- Открыть ipython
- import module_name
- введите имя модуля, нажмите вкладку. Он откроет небольшое окно со списком всех функций в модуле 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 features.
%quickref -> Quick reference.
help -> Python 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
Ответ 13
Вы можете использовать следующий метод, чтобы получить список всех функций в вашем модуле из оболочки:
import module
module.*?
Ответ 14
Это добавит все функции, которые определены в your_module в список.
result=[]
for i in dir(unit8_conversion_methods):
if type(getattr(your_module, i)).__name__ == "function":
result.append(getattr(your_module, i))
Ответ 15
Это не (или, по крайней мере, не более) правильное использование dir (module). Код должен выглядеть следующим образом:
dir('module') or dir('modules')
Или вы указываете модуль, который вы хотите: dir('sys')
для получения результатов от имени модуля sys. dir()
возвращает ошибки, а dir('')
- это то, что вам нужно. * help ('') возвращает справочную информацию, если доступна для большинства функций. например; help('modules')
вернет информацию о помощи модуля.
Спасибо за все поданные голоса. Я использовал Python3.2.2 и другие версии 3x, когда я разместил это. Дело было в том, чтобы использовать ( "материал" ) вместо предыдущего (материал). Но я предполагаю, что вы все застряли на Python2 или используете более новые версии для ПК, не такие мобильные, как я.
http://effbot.org/librarybook/sys.htm