จะแสดงรายการฟังก์ชั่นทั้งหมดในโมดูล Python ได้อย่างไร


418

ฉันมีโมดูลหลามติดตั้งในระบบของฉันและฉันต้องการที่จะเห็นว่าฟังก์ชั่น / ชั้นเรียน / วิธีการที่มีอยู่ในมัน

ฉันต้องการเรียกใช้ฟังก์ชั่น doc กับแต่ละอัน ในทับทิมฉันสามารถทำสิ่งต่าง ๆ เช่น ClassName.methods เพื่อรับรายการของวิธีการทั้งหมดที่มีในชั้นเรียนนั้น มีอะไรที่คล้ายกันในหลาม?

เช่น. สิ่งที่ต้องการ:

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

3
โปรดพิจารณาทบทวนคำตอบที่เลือก! มีคำตอบอื่น ๆ ที่ดีกว่า / ง่ายกว่า
Zahra

คำตอบ:


139

inspectโมดูล ดูpydocโมดูลhelp()ฟังก์ชั่นในล่ามแบบโต้ตอบและpydocเครื่องมือบรรทัดคำสั่งที่สร้างเอกสารที่คุณอยู่หลังจากนั้น คุณสามารถให้ชั้นเรียนที่คุณต้องการดูเอกสารประกอบ พวกเขายังสามารถสร้างตัวอย่างเช่นเอาท์พุท HTML และเขียนลงดิสก์


3
ผมได้ทำกรณีสำหรับการใช้astโมดูลในบางสถานการณ์ในคำตอบของฉัน
csl

28
TL; DR ของคำตอบด้านล่าง: ใช้dirเพื่อส่งคืนฟังก์ชันและตัวแปร; ใช้inspectสำหรับกรองฟังก์ชั่นเท่านั้น และใช้astในการแยกวิเคราะห์โดยไม่ต้องนำเข้า
Jonathan H

มันคุ้มค่าที่จะทำการทดสอบแต่ละวิธีที่สรุปโดย Sheljohn เนื่องจากผลลัพธ์ที่ได้นั้นแตกต่างอย่างมากจากโซลูชันหนึ่งไปยังโซลูชันถัดไป
clozach

1
@ Hack-R นี่คือรหัสที่จะแสดงรายการฟังก์ชั่นทั้งหมดใน mymodule: [f [0] สำหรับ f ใน inspect.getmembers (mymodule, inspect.isfunction)]
SurpriseDog

498

คุณสามารถใช้dir(module)เพื่อดูวิธีการ / คุณสมบัติที่มีอยู่ทั้งหมด ตรวจสอบ PyDocs ด้วย


15
นี่ไม่เป็นความจริงอย่างเคร่งครัด dir()ฟังก์ชั่น“ความพยายามในการผลิตที่เกี่ยวข้องมากที่สุดมากกว่าที่สมบูรณ์ข้อมูล” ที่มา: docs.python.org/library/functions.html#dir
Zearin

15
@jAckOdE อ้างถึงแล้วหรือ จากนั้นคุณจะได้รับวิธีการและคุณสมบัติที่มีอยู่ของโมดูลสตริง
OrangeTux

@OrangeTux: อ๊ะนั่นน่าจะเป็นคำถาม ใช่คุณตอบแล้ว
jAckOdE

1
OP ถามถึงฟังก์ชั่นอย่างชัดเจนไม่ใช่ตัวแปร ตอบ Cf inspectใช้
โจนาธานเอช

168

เมื่อคุณimportแก้ไขโมดูลแล้วคุณสามารถทำได้:

 help(modulename)

... เพื่อให้ได้เอกสารในทุกฟังก์ชั่นพร้อมกันแบบโต้ตอบ หรือคุณสามารถใช้:

 dir(modulename)

... เพื่อแสดงรายการชื่อของฟังก์ชั่นและตัวแปรทั้งหมดที่กำหนดไว้ในโมดูล


1
@ sheljohn …ประเด็นของการวิจารณ์นี้คืออะไร โซลูชันของฉันยังแสดงรายการฟังก์ชันและinspect โมดูลยังสามารถแสดงรายการตัวแปรแม้ว่าจะไม่ได้ร้องขออย่างชัดเจนที่นี่ โซลูชันนี้ต้องการเฉพาะวัตถุในตัวเท่านั้นซึ่งอาจมีประโยชน์มากในบางกรณีที่ติดตั้ง Python ในสภาพแวดล้อมที่มีข้อ จำกัด / ล็อคลง / สภาพแวดล้อมไม่ทำงาน
Dan Lenski

ขอบคุณนี้เกือบจะทำงาน แต่ผมคิดว่าdirจะพิมพ์ผล print(dir(modulename))แต่มันดูเหมือนว่าคุณต้องทำ
เอเลียต

96

ตัวอย่างที่มีการตรวจสอบ:

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 ส่งคืนรายการของ tuples (object_name, object_type)

คุณสามารถแทนที่ isfunction ด้วยฟังก์ชั่น isXXX อื่น ๆ ในโมดูลตรวจสอบ


27
getmembersสามารถใช้ภาคแสดงได้ดังนั้นตัวอย่างของคุณอาจถูกเขียนขึ้นด้วย: functions_list = [o for o in getmembers(my_module, isfunction)]
Christopher Currie

27
@ChristopherCurrie คุณสามารถหลีกเลี่ยงความเข้าใจในรายการที่ไร้ประโยชน์ด้วยfunctions_list = getmembers(my_module, predicate)เพราะมันส่งคืนรายการแล้ว)
ไม่มี

5
ในการค้นหาว่าฟังก์ชันมีการกำหนดไว้ในโมดูลนั้น (แทนที่จะนำเข้า) ให้เพิ่ม: เป็น "if isfunction (o [1]) และ o [1] .__ module__ == my_module .__ name__ " - โปรดทราบว่ามันจะไม่จำเป็นถ้า ฟังก์ชั่นที่นำเข้ามาจากโมดูลที่มีชื่อเดียวกับโมดูลนี้
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
สำหรับเส้นทางนี้ใช้ getattr (yourmodule, a, None) แทน yourmodule .__ dict __. get (a)
Thomas Wouters

4
your_module .__ dict__ เป็นตัวเลือกของฉันเพราะคุณได้รับ dict ที่มี functionName: <function> และตอนนี้คุณมีความสามารถในการเรียก CALL ที่ทำหน้าที่แบบไดนามิก ช่วงเวลาที่ดี!
jsh

1
Python 3 เป็นมิตรกับน้ำตาลบางชนิด: ชนิดการนำเข้า def print_module_functions (โมดูล): print ('\ n'.join ([str (โมดูล. _dict __. get (a) .__ name__)) สำหรับ in dir (โมดูล) ถ้า isinstance (โมดูล) __dict __. รับ (a), ประเภท. ประเภทฟังก์ชั่น)]))
y.selivonchyk

1
นี่จะแสดงรายการฟังก์ชันทั้งหมดที่โมดูลนั้นนำเข้า นั่นอาจจะใช่หรือไม่ใช่สิ่งที่คุณต้องการ
scubbo

47

เพื่อความสมบูรณ์ฉันต้องการชี้ให้เห็นว่าบางครั้งคุณอาจต้องการแยกวิเคราะห์รหัสแทนที่จะนำเข้า importจะดำเนินการการแสดงออกระดับบนสุดและที่อาจจะมีปัญหา

ยกตัวอย่างเช่นผมปล่อยให้ผู้ใช้เลือกฟังก์ชั่นจุดเริ่มต้นสำหรับแพคเกจถูกทำด้วยzipapp การใช้importและinspectความเสี่ยงในการใช้รหัส astray นำไปสู่ข้อขัดข้องช่วยให้ข้อความถูกพิมพ์ออกมากล่องโต้ตอบ 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แต่ข้อเสียคือการที่คุณไม่สามารถตรวจสอบฟังก์ชั่นที่สร้างขึ้นที่รันไทม์เช่น


2
ฉันชอบสิ่งนี้; ฉันกำลังพยายามค้นหาว่ามีใครบางคนเขียนเครื่องมือที่ทำบางอย่างเช่น pydoc แต่ไม่มีการนำเข้าโมดูล เพื่อให้ห่างไกลนี้เป็นตัวอย่างที่ดีที่สุดที่ฉันได้พบนี้ :)
เจมส์มิลส์

เห็นด้วยกับคำตอบนี้ ฉันต้องการฟังก์ชั่นนี้ในการทำงานโดยไม่คำนึงว่าไฟล์เป้าหมายอาจนำเข้าหรือเวอร์ชันใดของไพ ธ อนที่เขียนขึ้น สิ่งนี้ไม่ได้เรียกใช้กับปัญหาการนำเข้าที่นำมาใช้และการนำเข้าทำ
Eric Evans

วิธีการเกี่ยวกับตัวแปรโมดูล ( __version__ฯลฯ ) มีวิธีรับไหม
frakman1

29

สำหรับรหัสที่คุณไม่ต้องการแยกวิเคราะห์ฉันแนะนำวิธี AST ตาม @csl ด้านบน

สำหรับทุกสิ่งอื่น ๆ โมดูลการตรวจสอบนั้นถูกต้อง:

import inspect

import <module_to_inspect> as module

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

สิ่งนี้จะให้รายการของ 2-tuples ในแบบฟอร์ม [(<name:str>, <value:function>), ...]ในรูปแบบที่

คำตอบง่าย ๆ ข้างต้นนั้นมีการพูดถึงในคำตอบและความคิดเห็นต่าง ๆ แต่ไม่ได้พูดออกมาอย่างชัดเจน


ขอบคุณที่สะกดมันออกมา ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องหากคุณสามารถเรียกใช้การนำเข้าบนโมดูลเพื่อตรวจสอบได้
โจนาธาน H

25

นี่จะเป็นการหลอกลวง:

dir(module) 

อย่างไรก็ตามหากคุณพบว่ามันน่ารำคาญในการอ่านรายการที่ส่งคืนให้ใช้การวนซ้ำต่อไปนี้เพื่อรับหนึ่งชื่อต่อบรรทัด

for i in dir(module): print i

2
OP ถามถึงฟังก์ชั่นอย่างชัดเจนไม่ใช่ตัวแปร ตอบ Cf inspectใช้ นอกจากนี้คำตอบของ @ DanLenski แตกต่างกันอย่างไร
Jonathan H

20

dir(module) เป็นวิธีมาตรฐานเมื่อใช้สคริปต์หรือล่ามมาตรฐานตามที่ระบุไว้ในคำตอบส่วนใหญ่

อย่างไรก็ตามด้วยเปลือกหลามแบบอินเทอร์แอคทีฟเช่นIPythonคุณสามารถใช้การเติมแท็บเพื่อรับภาพรวมของวัตถุทั้งหมดที่กำหนดในโมดูล สิ่งนี้สะดวกกว่าการใช้สคริปต์และprintดูว่าอะไรถูกกำหนดในโมดูล

  • module.<tab> จะแสดงวัตถุทั้งหมดที่กำหนดในโมดูล (ฟังก์ชั่นคลาสและอื่น ๆ )
  • module.ClassX.<tab> จะแสดงวิธีการและคุณสมบัติของชั้นเรียน
  • module.function_xy?หรือmodule.ClassX.method_xy?จะแสดง docstring ของฟังก์ชั่น / วิธีการนั้น
  • module.function_x??หรือmodule.SomeClass.method_xy??จะแสดงซอร์สโค้ดของฟังก์ชัน / เมธอด

19

สำหรับฟังก์ชั่นระดับโลก 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__'
>>>

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

ฉันคิดว่านี่เป็นวิธีที่ถูกต้อง ทำไมต้องลงคะแนนเมื่อมัน?
m3nda

2

ยกเว้น dir (โมดูล) หรือความช่วยเหลือ (โมดูล) ที่กล่าวถึงในคำตอบก่อนหน้านี้คุณยังสามารถลอง:
- เปิด ipython
- นำเข้า module_name
- ประเภท module_name, แท็บกด มันจะเปิดหน้าต่างเล็ก ๆ ที่มีรายการฟังก์ชั่นทั้งหมดในโมดูลหลาม
มันดูเรียบร้อยมาก

นี่คือรายการตัวอย่างฟังก์ชั่นทั้งหมดของโมดูล 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

สิ่งนี้จะผนวกฟังก์ชั่นทั้งหมดที่กำหนดไว้ใน your_module ในรายการ

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 ใช่มันเป็นเพียงชื่อโมดูล
Manish Kumar

2
ขอบคุณ Manish ฉันเสนอทางเลือกหนึ่งบรรทัดต่อไปนี้:[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
มีน

0

คุณสามารถใช้วิธีการต่อไปนี้เพื่อรับรายการฟังก์ชั่นทั้งหมดในโมดูลของคุณจากเชลล์:

import module

module.*?

1
@GabrielFair คุณกำลังใช้งาน python อยู่บนแพลตฟอร์ม / รุ่นใด? ฉันได้รับข้อผิดพลาดทางไวยากรณ์ใน Py3.7 / Win10
toonarmycaptain


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.