Bagaimana cara membuat daftar semua fungsi dalam modul Python?


418

Saya memiliki modul python yang diinstal pada sistem saya dan saya ingin dapat melihat fungsi / kelas / metode apa yang tersedia di dalamnya.

Saya ingin memanggil fungsi doc pada masing-masing. Dalam ruby ​​saya dapat melakukan sesuatu seperti ClassName.methods untuk mendapatkan daftar semua metode yang tersedia di kelas itu. Apakah ada yang serupa dengan python?

misalnya. sesuatu seperti:

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

3
silakan pertimbangkan meninjau jawaban yang dipilih! ada solusi yang lebih baik / lebih mudah digunakan yang disarankan dalam jawaban lain.
Zahra

Jawaban:


139

The inspectmodul. Juga lihat pydocmodul, help()fungsi dalam interpreter interaktif dan pydocalat baris perintah yang menghasilkan dokumentasi yang Anda cari. Anda bisa memberi mereka kelas yang ingin Anda lihat dokumentasi. Mereka juga dapat menghasilkan, misalnya, output HTML dan menulisnya ke disk.


3
Saya telah membuat kasus untuk menggunakan astmodul dalam situasi tertentu dalam jawaban saya .
csl

28
TL; DR jawaban di bawah ini: gunakan diruntuk mengembalikan fungsi dan variabel; gunakan inspectuntuk memfilter fungsi saja; dan gunakan astuntuk menguraikan tanpa mengimpor.
Jonathan H

Layak menguji setiap pendekatan seperti yang dirangkum oleh Sheljohn karena output yang dihasilkan berbeda secara drastis dari satu solusi ke solusi berikutnya.
clozach

1
@ Hack-R Ini adalah kode untuk mencantumkan semua fungsi di mymodule: [f [0] untuk f di inspect.getmembers (mymodule, inspect.isfunction)]
SurpriseDog

498

Anda dapat menggunakan dir(module)untuk melihat semua metode / atribut yang tersedia. Lihat juga PyDocs.


15
Ini tidak sepenuhnya benar. The dir()fungsi “upaya untuk menghasilkan yang paling relevan, daripada lengkap, informasi”. Sumber: docs.python.org/library/functions.html#dir .
Zearin

15
@ jAckOdE Dikutip? Kemudian Anda akan mendapatkan metode dan atribut yang tersedia dari modul string.
OrangeTux

@OrangeTux: oops, seharusnya itu pertanyaan. ya, Anda menjawabnya.
JAckOdE

1
OP jelas meminta fungsi, bukan variabel. Cf jawaban menggunakan inspect.
Jonathan H

168

Setelah Anda importmengedit modul, Anda bisa melakukan:

 help(modulename)

... Untuk mendapatkan dokumen pada semua fungsi sekaligus, secara interaktif. Atau Anda dapat menggunakan:

 dir(modulename)

... Untuk sekadar daftar nama semua fungsi dan variabel yang ditentukan dalam modul.


1
@ sheljohn ... apa gunanya kritik ini? Solusi saya juga mencantumkan fungsi, dan inspect modul juga dapat mencantumkan variabel, meskipun tidak secara eksplisit diminta di sini. Solusi ini hanya memerlukan objek bawaan, yang dapat sangat berguna dalam beberapa kasus di mana Python diinstal di lingkungan yang dikunci / dikunci / rusak.
Dan Lenski

Terima kasih, ini hampir berhasil, tetapi saya pikir itu dirakan mencetak hasilnya, namun sepertinya Anda perlu melakukannya print(dir(modulename)).
Eliot

96

Contoh dengan memeriksa:

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 mengembalikan daftar tupel (object_name, object_type).

Anda dapat mengganti fungsi dengan fungsi isXXX lainnya di modul inspect.


27
getmembersdapat mengambil predikat, jadi contoh Anda juga bisa ditulis: functions_list = [o for o in getmembers(my_module, isfunction)]
Christopher Currie

27
@ChristopherCurrie, Anda juga dapat menghindari pemahaman daftar yang tidak berguna functions_list = getmembers(my_module, predicate)karena sudah mengembalikan daftar;)
Nil

5
Untuk menemukan apakah fungsi didefinisikan dalam modul itu (bukan diimpor) tambahkan: ke "jika tidak berfungsi (o [1]) dan o [1] .__ module__ == my_module .__ name__ " - perhatikan bahwa fungsi itu tidak akan berfungsi jika fungsi yang diimpor berasal dari modul dengan nama yang sama dengan modul ini.
Michael Scott Cuthbert

72
import types
import yourmodule

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

8
Untuk rute ini, gunakan getattr (yourmodule, a, None) alih-alihmodule Anda .__ dict __. Get (a)
Thomas Wouters

4
your_module .__ dict__ adalah pilihan saya karena Anda benar-benar mendapatkan dict yang berisi functionName: <fungsi> dan sekarang Anda memiliki kemampuan untuk MEMANGGIL fungsi itu secara dinamis. masa-masa yang menyenangkan!
jsh

1
Python 3 bersahabat dengan beberapa gula: impor jenis def print_module_functions (module): print ('\ n'.join ([str (module .__ dict __. Get (a) .__ name__) untuk dir (modul) jika isinstance (modul. __dict __. get (a), types.FunctionType)]))
y.selivonchyk

1
Ini juga akan mencantumkan semua fungsi yang diimpor modul. Itu mungkin atau mungkin bukan yang Anda inginkan.
scubbo

48

Demi kelengkapan, saya ingin menunjukkan bahwa kadang-kadang Anda mungkin ingin mem - parsing kode alih-alih mengimpornya. Sebuah importakan mengeksekusi ekspresi tingkat atas, dan itu bisa menjadi masalah.

Sebagai contoh, saya membiarkan pengguna memilih fungsi titik masuk untuk paket yang dibuat dengan zipapp . Menggunakan importdan inspectberisiko menjalankan kode sesat, yang menyebabkan macet, pesan bantuan dicetak, dialog GUI muncul dan sebagainya.

Sebagai gantinya saya menggunakan modul ast untuk membuat daftar semua fungsi tingkat atas:

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)

Dengan list.pymemasukkan kode ini dan menggunakannya sebagai input, saya dapat:

$ python list.py list.py
list.py
  top_level_functions
  parse_ast

Tentu saja, menavigasi AST kadang-kadang bisa rumit, bahkan untuk bahasa yang relatif sederhana seperti Python, karena AST cukup rendah. Tetapi jika Anda memiliki kasus penggunaan yang sederhana dan jelas, itu bisa dilakukan dan aman.

Meskipun demikian, kerugiannya adalah Anda tidak dapat mendeteksi fungsi yang dihasilkan saat runtime foo = lambda x,y: x*y.


3
Saya suka ini; Saat ini saya mencoba mencari tahu apakah seseorang telah menulis alat yang melakukan sesuatu seperti pydoc tetapi tanpa mengimpor modul. Sejauh ini, ini adalah contoh terbaik yang saya temukan tentang ini :)
James Mills

Setuju dengan jawaban ini. Saya membutuhkan fungsi ini untuk berfungsi terlepas dari apa file target dapat mengimpor atau untuk apa versi python itu ditulis. Ini tidak mengalami masalah impor yang imp dan importlib lakukan.
Eric Evans

Bagaimana dengan variabel modul ( __version__dll). Apakah ada cara untuk mendapatkannya?
frakman1

29

Untuk kode yang tidak ingin diuraikan, saya merekomendasikan pendekatan berbasis AST dari @csl di atas.

Untuk yang lainnya, modul inspeksi benar:

import inspect

import <module_to_inspect> as module

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

Ini memberikan daftar 2-tupel dalam formulir [(<name:str>, <value:function>), ...].

Jawaban sederhana di atas diisyaratkan dalam berbagai tanggapan dan komentar, tetapi tidak dipanggil secara eksplisit.


Terima kasih telah mengejanya; Saya pikir ini adalah jawaban yang tepat, jika Anda dapat menjalankan impor pada modul untuk memeriksa.
Jonathan H

25

Ini akan melakukan trik:

dir(module) 

Namun, jika Anda merasa terganggu membaca daftar yang dikembalikan, cukup gunakan loop berikut untuk mendapatkan satu nama per baris.

for i in dir(module): print i

2
OP jelas meminta fungsi, bukan variabel. Cf jawaban menggunakan inspect. Selain itu, bagaimana ini berbeda dari jawaban @ DanLenski?
Jonathan H

20

dir(module) adalah cara standar saat menggunakan skrip atau penerjemah standar, sebagaimana disebutkan dalam sebagian besar jawaban.

Namun dengan shell python interaktif seperti IPython Anda dapat menggunakan tab-completion untuk mendapatkan gambaran umum dari semua objek yang didefinisikan dalam modul. Ini jauh lebih nyaman, daripada menggunakan skrip dan printuntuk melihat apa yang didefinisikan dalam modul.

  • module.<tab> akan menunjukkan semua objek yang didefinisikan dalam modul (fungsi, kelas, dan sebagainya)
  • module.ClassX.<tab> akan menunjukkan kepada Anda metode dan atribut kelas
  • module.function_xy?atau module.ClassX.method_xy?akan menunjukkan kepada Anda dokumentasi fungsi / metode tersebut
  • module.function_x??atau module.SomeClass.method_xy??akan menunjukkan kode sumber fungsi / metode kepada Anda.

19

Untuk fungsi global dir() adalah perintah untuk menggunakan (sebagaimana disebutkan dalam sebagian besar jawaban ini), namun ini mencantumkan fungsi publik dan non-publik bersamaan.

Misalnya menjalankan:

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

Mengembalikan fungsi / kelas seperti:

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

Beberapa di antaranya umumnya tidak dimaksudkan untuk penggunaan pemrograman umum (tetapi oleh modul itu sendiri, kecuali dalam kasus DunderAliases seperti __doc__, __file__dll). Untuk alasan ini mungkin tidak berguna untuk mendaftar mereka dengan yang umum (ini adalah bagaimana Python tahu apa yang harus didapatkan saat menggunakan from module import *).

__all__dapat digunakan untuk mengatasi masalah ini, ia mengembalikan daftar semua fungsi publik dan kelas dalam modul (yang tidak dimulai dengan garis bawah - _). Lihat Bisakah seseorang menjelaskan __all__ dengan Python? untuk penggunaan__all__ .

Berikut ini sebuah contoh:

>>> 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']
>>>

Semua fungsi dan kelas dengan garis bawah telah dihapus, hanya menyisakan yang didefinisikan sebagai publik dan karenanya dapat digunakan melalui import * .

Catatan yang __all__tidak selalu ditentukan. Jika tidak disertakan maka sebuahAttributeError dimunculkan.

Kasus ini adalah dengan modul ast:

>>> import ast
>>> ast.__all__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'ast' has no attribute '__all__'
>>>

4

Tak satu pun dari jawaban ini akan berfungsi jika Anda tidak dapat mengimpor kata file Python tanpa kesalahan impor. Ini adalah kasus bagi saya ketika saya memeriksa file yang berasal dari basis kode besar dengan banyak dependensi. Berikut ini akan memproses file sebagai teks dan mencari semua nama metode yang dimulai dengan "def" dan mencetaknya serta nomor barisnya.

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
Dalam hal ini lebih baik menggunakan astmodul. Lihat jawaban saya sebagai contoh.
csl

Saya pikir ini adalah metode yang valid. Mengapa downvote ketika itu terjadi?
m3nda

2

Kecuali dir (modul) atau bantuan (modul) yang disebutkan dalam jawaban sebelumnya, Anda juga dapat mencoba:
- Buka ipython
- import module_name
- ketik module_name, tekan tab. Ini akan membuka jendela kecil dengan daftar semua fungsi dalam modul python.
Terlihat sangat rapi.

Berikut ini cuplikan daftar semua fungsi modul 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

1

Ini akan menambahkan semua fungsi yang didefinisikan dalam modul_Anda dalam daftar.

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

Apa ini unit8_conversion_methods? Apakah ini hanya contoh dari nama modul?
nocibambi

@nocibambi ya itu hanya nama modul.
Manish Kumar

2
terima kasih Manish. Saya mengusulkan alternatif satu baris berikut:[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
amina

0

Anda dapat menggunakan metode berikut untuk mendapatkan daftar semua fungsi di modul Anda dari shell:

import module

module.*?

1
@GabrielFair versi / platform apa yang Anda jalankan python? Saya mendapatkan kesalahan sintaks pada 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)

Keluaran:

******************************************************************************************
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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.