584 Stimmen

Wie kann man alle Funktionen in einem Python-Modul auflisten?

Ich habe ein Python-Modul auf meinem System installiert und würde gerne sehen, welche Funktionen/Klassen/Methoden darin verfügbar sind.

Ich möchte die help Funktion für jeden einzelnen. In Ruby kann ich etwas tun wie ClassName.methods um eine Liste aller für diese Klasse verfügbaren Methoden zu erhalten. Gibt es etwas Ähnliches in Python?

z. B. so etwas wie:

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

7voto

ckb Punkte 6123

Keine dieser Antworten wird funktionieren, wenn Sie nicht in der Lage sind, die Python-Datei ohne Importfehler zu importieren. Dies war bei mir der Fall, als ich eine Datei untersuchte, die aus einer großen Codebasis mit vielen Abhängigkeiten stammt. Das Folgende verarbeitet die Datei als Text und sucht nach allen Methodennamen, die mit "def" beginnen, und gibt sie mit Zeilennummern aus.

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

4 Stimmen

In diesem Fall ist es viel besser, die ast Modul. Siehe meine Antwort für ein Beispiel.

0 Stimmen

Ich denke, das ist eine gute Methode. Warum ein Downvote, wenn es das tut?

6voto

Josh Peak Punkte 4948

Suche nach den Namen (und aufrufbaren Objekten) im aktuellen Skript __main__

Ich habe versucht, ein eigenständiges Python-Skript zu erstellen, das nur die Standardbibliothek verwendet, um Funktionen in der aktuellen Datei mit dem Präfix task_ um eine minimale selbstgebaute Version dessen zu erstellen, was npm run bietet.

TL;DR

Wenn Sie ein eigenständiges Skript ausführen, müssen Sie inspect.getmembers über die module die definiert ist in sys.modules['__main__'] . Beispiel,

inspect.getmembers(sys.modules['__main__'], inspect.isfunction)

Aber ich wollte die Liste der Methoden nach Präfix filtern und das Präfix entfernen, um ein Nachschlagewörterbuch zu erstellen.

def _inspect_tasks():
    import inspect
    return { f[0].replace('task_', ''): f[1] 
        for f in inspect.getmembers(sys.modules['__main__'], inspect.isfunction)
        if f[0].startswith('task_')
    }

Beispiel Ausgabe:

{
 'install': <function task_install at 0x105695940>,
 'dev': <function task_dev at 0x105695b80>,
 'test': <function task_test at 0x105695af0>
}

Längere Version

Ich wollte, dass die Namen der Methoden die Namen der CLI-Aufgaben definieren, ohne mich wiederholen zu müssen.

./tasks.py

#!/usr/bin/env python3
import sys
from subprocess import run

def _inspect_tasks():
    import inspect
    return { f[0].replace('task_', ''): f[1] 
        for f in inspect.getmembers(sys.modules['__main__'], inspect.isfunction)
        if f[0].startswith('task_')
    }

def _cmd(command, args):
    return run(command.split(" ") + args)

def task_install(args):
    return _cmd("python3 -m pip install -r requirements.txt -r requirements-dev.txt --upgrade", args)

def task_test(args):
    return _cmd("python3 -m pytest", args)

def task_dev(args):
    return _cmd("uvicorn api.v1:app", args)

if __name__ == "__main__":
    tasks = _inspect_tasks()

    if len(sys.argv) >= 2 and sys.argv[1] in tasks.keys():
        tasks[sys.argv[1]](sys.argv[2:])
    else:
        print(f"Must provide a task from the following: {list(tasks.keys())}")

Beispiel ohne Argumente:

 ./tasks.py
Must provide a task from the following: ['install', 'dev', 'test']

Beispiel für einen Test mit zusätzlichen Argumenten:

 ./tasks.py test -qq
s.ssss.sF..Fs.sssFsss..ssssFssFs....s.s    

Sie wissen, worum es geht. Da meine Projekte immer umfangreicher werden, wird es einfacher sein, ein Skript auf dem neuesten Stand zu halten, als die README auf dem neuesten Stand zu halten, und ich kann es auf das Wesentliche reduzieren:

./tasks.py install
./tasks.py dev
./tasks.py test
./tasks.py publish
./tasks.py logs

0 Stimmen

@muuvmuuv innerhalb der sys.modules['__main__'] alle Codes, die bereits in die Datenbank importiert wurden __main__ Skript sollte vorhanden sein. Ich habe dies gerade mit dem inspect.isclass anstelle von inspect.isfunction und es hat bei mir funktioniert. docs.python.org/3/Bibliothek/inspect.html#inspect.isclass

5voto

Boris V Punkte 10136

Verwenden Sie vars(module) dann alles herausfiltern, was keine Funktion ist, indem Sie inspect.isfunction :

import inspect
import my_module

my_module_functions = [f for _, f in vars(my_module).values() if inspect.isfunction(f)]

Der Vorteil von vars über dir o inspect.getmembers ist, dass die Funktionen in der Reihenfolge ihrer Definition und nicht alphabetisch sortiert zurückgegeben werden.

Dazu gehören auch Funktionen, die von my_module wenn Sie diese herausfiltern wollen, um nur Funktionen zu erhalten, die in my_module , siehe meine Frage Alle definierten Funktionen im Python-Modul abrufen .

0 Stimmen

Genau das brauche ich! vars kann die Reihenfolge beibehalten

4voto

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

3voto

Außer dir(module) oder help(module), die in früheren Antworten erwähnt wurden, können Sie es auch versuchen:
- ipython öffnen
- importieren modul_name
- Modul_name eingeben, Tabulator drücken. Es öffnet sich ein kleines Fenster mit einer Liste aller Funktionen im Python-Modul.
Es sieht sehr ordentlich aus.

Hier ist ein Schnipsel, der alle Funktionen des Moduls hashlib auflistet

(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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X