[python] 파이썬 모듈에서 모든 함수를 나열하는 방법?

시스템에 파이썬 모듈이 설치되어 있으며 사용할 수있는 기능 / 클래스 / 방법을보고 싶습니다.

각각에 doc 함수를 호출하고 싶습니다. 루비에서는 ClassName.methods와 같은 것을 수행하여 해당 클래스에서 사용할 수있는 모든 메소드 목록을 얻을 수 있습니다. 파이썬에 비슷한 것이 있습니까?

예. 같은 :

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



답변

inspect모듈. 또한 참조 pydoc모듈은 help()대화 형 인터프리터와 함수를pydoc 이후의 문서를 생성하는 명령 행 도구를 참조하십시오. 문서를보고 싶은 수업을 주면됩니다. 예를 들어 HTML 출력을 생성하여 디스크에 쓸 수도 있습니다.


답변

사용 dir(module)가능한 모든 방법 / 속성을 볼 수 있습니다 . PyDocs도 확인하십시오.


답변

import모듈을 편집 한 후에 는 다음을 수행 할 수 있습니다.

 help(modulename)

… 한 번에 모든 기능에 대한 문서를 대화식으로 가져옵니다. 또는 다음을 사용할 수 있습니다.

 dir(modulename)

… 모듈에 정의 된 모든 함수와 변수의 이름을 간단히 나열합니다.


답변

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는 (object_name, object_type) 튜플 목록을 리턴합니다.

inspect 모듈에서 isfunction을 다른 isXXX 기능으로 바꿀 수 있습니다.


답변

import types
import yourmodule

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


답변

완벽을 기하기 위해 때로는 코드를 가져 오는 대신 구문 분석 할 수 있음을 지적하고 싶습니다 . 는 최상위 식 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 탐색은 까다로울 수 있습니다. AST는 수준이 낮기 때문에 Python과 같은 비교적 간단한 언어의 경우에도 마찬가지입니다. 그러나 간단하고 명확한 유스 케이스가 있으면 가능하고 안전합니다.

그러나 단점은와 같이 런타임에 생성되는 함수를 감지 할 수 없다는 것 foo = lambda x,y: x*y입니다.


답변

구문 분석하지 않으려는 코드의 경우 위의 @csl의 AST 기반 접근 방식을 권장합니다.

다른 모든 경우에는 inspect 모듈이 정확합니다.

import inspect

import <module_to_inspect> as module

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

이것은 형식의 2 튜플 목록을 제공합니다 [(<name:str>, <value:function>), ...].

위의 간단한 답변은 다양한 답변과 의견에 암시되어 있지만 명시 적으로 언급되지 않았습니다.