Как перечислить все функции в модуле 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