Як перелічити всі функції модуля Python?


418

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

Я хочу викликати функцію doc на кожному. У рубіні я можу зробити щось на зразок ClassName.methods, щоб отримати список усіх методів, доступних для цього класу. Чи є щось подібне в python?

напр. щось на зразок:

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

3
будь ласка, перегляньте обрану відповідь! є кращі / простіші у використанні рішення, запропоновані в інших відповідях.
Захра

Відповіді:


139

inspectМодуль. Також дивіться pydocмодуль, help()функцію в інтерактивному перекладачі та інструмент pydocкомандного рядка, який створює документацію, яку ви шукаєте. Ви можете просто дати їм клас, на який ви хочете переглянути документацію. Вони також можуть генерувати, наприклад, вихід HTML та записувати його на диск.


3
Я вирішив використовувати astмодуль у певних ситуаціях у своїй відповіді .
csl

28
TL; DR відповідей нижче: використовувати dirдля повернення функцій та змінних; використовувати лише inspectдля фільтрації функцій; і використовувати astдля розбору без імпорту.
Джонатан Н

Варто перевірити кожен із підходів, узагальнених Шельоном, оскільки отриманий результат різко відрізняється від рішення до іншого.
clozach

1
@ Hack-R Ось код, у якому перераховані всі функції в мій модулі: [f [0] for f in inspect.getmembers (mymodule, inspect.isfunction)]
SurpriseDog

498

Ви можете використовувати dir(module)для перегляду всіх доступних методів / атрибутів. Також перевірте PyDocs.


15
Це не зовсім вірно. У dir()функції «спроби отримати найактуальнішу, а не повну, інформацію». Джерело: docs.python.org/library/functions.html#dir .
Зерін

15
@jAckOdE Цитується? Тоді ви отримаєте доступні методи та атрибути рядкового модуля.
OrangeTux

@ OrangeTux: ой, це повинно бути питанням. так, ти відповів на це.
jAckOdE

1
ОП чітко запитує функції, а не змінні. Cf відповідає за допомогою inspect.
Джонатан Н

168

Після importредагування модуля ви можете просто зробити:

 help(modulename)

... Інтерактивно отримувати документи на всі функції відразу. Або ви можете використовувати:

 dir(modulename)

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


1
@ шельон ... у чому сенс цієї критики? У моєму рішенні також перелічені функції, і inspect модуль також може перелічувати змінні, хоча тут прямо не вимагається. Це рішення вимагає лише вбудованих об'єктів, що може бути дуже корисно в деяких випадках, коли Python встановлюється в обмеженому / замкненому / зламаному середовищі.
Дан Ленськи

Дякую, це майже спрацювало, але я думав, що dirце надрукує результати, проте, схоже, що вам потрібно зробити print(dir(modulename)).
Еліот

96

Приклад з Inspect:

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 повертає список (корпоративні_імена, тип_об'єкта) кортежів.

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


27
getmembersВи можете приймати присудок, тож ваш приклад також може бути записаний: functions_list = [o for o in getmembers(my_module, isfunction)]
Крістофер Керрі

27
@ChristopherCurrie, ви також можете уникнути марного осмислення списку, functions_list = getmembers(my_module, predicate)оскільки він уже повертає список;)
Nil

5
Щоб дізнатись, чи визначена функція в цьому модулі (а не імпортована), додайте: до "якщо функція (o [1]) та o [1] .__ модуль__ == мій_модуль .__ ім'я__ " - зауважте, що вона не працюватиме обов'язково, якщо імпортна функція походить від модуля з тим же найменуванням, що і цей модуль.
Майкл Скотт Катберт

72
import types
import yourmodule

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

8
Для цього маршруту використовуйте getattr (yourmodule, a, None) замість yourmodule .__ dict __. Get (a)
Thomas Wouters,

4
your_module .__ dict__ - це мій вибір, тому що ви фактично отримуєте dict, що містить functionName: <function>, і тепер у вас є можливість ЗВІНИТИ цю функцію динамічно. хороші часи!
jsh

1
Python 3 дружній з деяким цукром: типи імпорту def print_module_functions (модуль): print ('\ n'.join ([str (модуль .__ dict __. Get (a) .__ ім'я__) для a in dir (module), якщо є речовина (module. __dict __. get (a), types.FunctionType)]))
y.selivonchyk

1
Тут також буде перелічено всі функції, які імпортує цей модуль. Це може бути або не бути тим, що ви хочете.
scubbo

47

Для повноти я хочу зазначити, що іноді вам може знадобитися проаналізувати код, а не імпортувати його. А 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

Звичайно, навігація по AST часом може бути складною, навіть для відносно простої мови на зразок Python, оскільки AST досить низький. Але якщо у вас простий і зрозумілий кейс для використання, це одночасно і придатно, і безпечно.

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


2
Мені це подобається; Зараз я намагаюся з’ясувати, чи вже хтось написав інструмент, який робить щось на зразок pydoc, але без імпорту модуля. Поки що це найкращий приклад, який я знайшов із цього :)
Джеймс Міллс

Погодився з цією відповіддю. У мене є необхідність, щоб ця функція працювала незалежно від того, який цільовий файл може імпортувати або для якої версії python він призначений. Це не стикається з проблемами імпорту, які роблять imp і importlib.
Ерік Еванс

Як щодо змінних модулів ( __version__тощо). Чи є спосіб отримати це?
frakman1

29

Щодо коду, який ви не бажаєте розбирати, я рекомендую підхід на основі AST @csl вище.

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

import inspect

import <module_to_inspect> as module

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

Це дає список 2-кортежів у формі [(<name:str>, <value:function>), ...].

Проста відповідь, наведена вище, натякається на різні відповіді та коментарі, але не викликається прямо.


Дякуємо, що прописали це; Я думаю, що це правильна відповідь, якщо ви можете запустити імпорт на модуль для перевірки.
Джонатан Н

25

Це зробить трюк:

dir(module) 

Однак якщо вам стає прикро читати повернений список, просто використовуйте наступний цикл, щоб отримати одне ім’я на рядок.

for i in dir(module): print i

2
ОП чітко запитує функції, а не змінні. Cf відповідає за допомогою inspect. Крім того, чим це відрізняється від відповіді @ DanLenski?
Джонатан Н

20

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

Однак, використовуючи інтерактивну оболонку пітона, як IPython, ви можете скористатися вкладкою для огляду всіх об'єктів, визначених у модулі. Це набагато зручніше, ніж використовувати скрипт і printподивитися, що визначено в модулі.

  • module.<tab> покаже всі об'єкти, визначені в модулі (функції, класи тощо)
  • module.ClassX.<tab> покаже вам методи та атрибути класу
  • module.function_xy?або module.ClassX.method_xy?покаже вам докстринг цієї функції / методу
  • module.function_x??або module.SomeClass.method_xy??покаже вам вихідний код функції / методу.

19

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

Наприклад, працює:

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

Повертає функції / класи типу:

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

Деякі з них, як правило, не призначені для загального використання в програмуванні (але самим модулем, за винятком випадку, наприклад __doc__, DunderAliases , __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__'
>>>

4

Жоден із цих відповідей не буде працювати, якщо ви не можете імпортувати згаданий файл 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])

3
У цьому випадку набагато краще використовувати astмодуль. Дивіться мою відповідь для прикладу.
csl

Я думаю, що це правильний метод. Чому головоломка, коли це робить?
м3нда

2

Крім dir (модуля) або довідки (модуля), згаданих у попередніх відповідях, ви також можете спробувати:
- Відкрити ipython
- імпортувати ім'я_модуля
- ввести ім'я_модуля, натиснути вкладку. Це відкриє невелике вікно із переліком усіх функцій модуля python.
Це виглядає дуже акуратно.

Тут представлений фрагмент переліку всіх функцій модуля хешлібу

(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

1

Це додасть до списку всі функції, визначені у вашому_модулі.

result=[]
for i in dir(your_module):
    if type(getattr(your_module, i)).__name__ == "function":
        result.append(getattr(your_module, i))

Що це unit8_conversion_methods? Це лише приклад назви модуля?
nocibambi

@nocibambi так, це лише назва модуля.
Маніш Кумар

2
спасибі Маніш. Я пропоную наступну однолінійну альтернативу:[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
amine

0

Ви можете скористатися наступним методом, щоб отримати список всіх функцій вашого модуля з оболонки:

import module

module.*?

1
@GabrielFair, на якій версії / платформі ви використовуєте python? Я отримую синтаксичну помилку на Py3.7 / Win10.
toonarmycaptain

0
import sys
from inspect import getmembers, isfunction
fcn_list = [o[0] for o in getmembers(sys.modules[__name__], isfunction)]

0
r = globals()
sep = '\n'+100*'*'+'\n' # To make it clean to read.
for k in list(r.keys()):
    try:
        if str(type(r[k])).count('function'):
            print(sep+k + ' : \n' + str(r[k].__doc__))
    except Exception as e:
        print(e)

Вихід:

******************************************************************************************
GetNumberOfWordsInTextFile : 

    Calcule et retourne le nombre de mots d'un fichier texte
    :param path_: le chemin du fichier à analyser
    :return: le nombre de mots du fichier

******************************************************************************************

    write_in : 

        Ecrit les donnees (2nd arg) dans un fichier txt (path en 1st arg) en mode a,
        :param path_: le path du fichier texte
        :param data_: la liste des données à écrire ou un bloc texte directement
        :return: None


 ******************************************************************************************
    write_in_as_w : 

            Ecrit les donnees (2nd arg) dans un fichier txt (path en 1st arg) en mode w,
            :param path_: le path du fichier texte
            :param data_: la liste des données à écrire ou un bloc texte directement
            :return: None
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.