Как перечислить все функции в модуле Python? - PullRequest
341 голосов
/ 26 сентября 2008

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

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

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

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

Ответы [ 15 ]

435 голосов
/ 26 сентября 2008

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

139 голосов
/ 26 сентября 2008

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

 help(modulename)

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

 dir(modulename)

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

113 голосов
/ 26 сентября 2008

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

76 голосов
/ 21 марта 2012

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

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 в модуле проверки.

67 голосов
/ 26 сентября 2008
import types
import yourmodule

print([getattr(yourmodule, a) for a in dir(yourmodule)
  if isinstance(getattr(yourmodule, a), types.FunctionType)])
37 голосов
/ 23 июня 2015

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

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

Вместо этого я использую модуль 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

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

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

23 голосов
/ 27 сентября 2008

Это поможет:

dir(module) 

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

for i in dir(module): print i
20 голосов
/ 08 сентября 2017

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

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

import inspect

import <module_to_inspect> as module

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

Это дает список из двух кортежей в форме [(<name:str>, <value:function>), ...].

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

20 голосов
/ 10 апреля 2012

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

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

  • module.<tab> покажет вам все объекты, определенные в модуле (функции, классы и т. Д.)
  • module.ClassX.<tab> покажет вам методы и атрибуты класса
  • module.function_xy? или module.ClassX.method_xy? покажет вам строку документации этой функции / метода
  • module.function_x?? или module.SomeClass.method_xy?? покажет вам исходный код функции / метода.
15 голосов
/ 26 марта 2018

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

Например, работает:

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

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

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

Некоторые из них, как правило, не предназначены для общего использования в программировании (но самим модулем, за исключением случаев с DunderAliases, таких как __doc__, __file__ ect). По этой причине может быть бесполезно перечислять их с общедоступными (именно так 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__'
>>>
...