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


418

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

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

예. 같은 :

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
아래 답변의 DR : dir함수와 변수를 반환 하는 데 사용 합니다. inspect기능 만 필터링 하는 데 사용하십시오 . ast가져 오지 않고 구문 분석 하는 데 사용 합니다.
Jonathan H

결과 출력이 솔루션마다 크게 다르기 때문에 Sheljohn이 요약 한 각 접근법을 테스트 해 볼 가치가 있습니다.
clozach

1
@ Hack-R 다음은 mymodule의 모든 기능을 나열하는 코드입니다. inspect.getmembers (mymodule, inspect.isfunction)의 f에 대한 [f [0]]
SurpriseDog

498

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


15
이것은 사실이 아닙니다. 이 dir()기능은 "완전한 것이 아니라 가장 관련성이 높은 정보를 생성하려고 시도합니다". 출처 : docs.python.org/library/functions.html#dir .
Zearin

15
@jAckOdE가 인용 되었습니까? 그런 다음 문자열 모듈의 사용 가능한 메소드 및 속성을 얻습니다.
OrangeTux

@OrangeTux : 죄송합니다. 질문입니다. 응, 대답했다.
jAckOdE

1
OP는 변수가 아닌 기능을 명확하게 요구합니다. Cf는을 사용하여 답변 inspect합니다.
Jonathan H

168

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

 help(modulename)

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

 dir(modulename)

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


1
@ sheljohn…이 비평의 요점은 무엇입니까? 내 솔루션 에는 함수 나열되어 있으며 inspect 모듈은 명시 적으로 요청하지 않아도 변수를 나열 할 수도 있습니다. 이 솔루션에는 내장 객체 만 있으면되며, 파이썬이 제한적 / 잠금 / 깨진 환경에 설치되는 경우에 매우 유용 할 수 있습니다.
Dan Lenski

고마워, 이것은 거의 효과가 있었지만 dir결과가 인쇄 될 것이라고 생각했지만 필요한 것 같습니다 print(dir(modulename)).
Eliot

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

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


27
getmembers: 술어를 취할 수 있습니다, 그래서 당신의 예를도 작성할 수 있습니다 functions_list = [o for o in getmembers(my_module, isfunction)]
크리스토퍼 커리를

27
@ChristopherCurrie, 당신은 또한 functions_list = getmembers(my_module, predicate)이미 목록을 반환하기 때문에 쓸모없는 목록 이해를 피할 수 있습니다 ;)
Nil

5
함수가 가져 오기보다는 해당 모듈에 정의되어 있는지 확인하려면 다음을 추가하십시오 : if isfunction (o [1]) and 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
이 경로의 경우 yourmodule .__ dict __. get (a) 대신 getattr (yourmodule, a, None)을 사용하십시오.
Thomas Wouters

4
your_module .__ dict__는 실제로 functionName : <function>을 포함하는 dict을 얻고 이제 해당 함수를 동적으로 호출 할 수 있기 때문에 선택합니다. 좋은 시간!
jsh

1
일부 설탕과 친숙한 Python 3 : import type def print_module_functions (module) : print ( '\ n'.join ([in (dir) 경우 in dir (module)에 대한 [str (module .__ dict __. get (a) .__ name__)) isinstance (module). __dict __. get (a),
types.FunctionType

1
또한 해당 모듈이 가져 오는 모든 기능이 나열됩니다. 그것은 당신이 원하는 것일 수도 아닐 수도 있습니다.
Scubbo

47

완벽을 기하기 위해 때로는 코드를 가져 오는 대신 구문 분석 할 수 있음을 지적하고 싶습니다 . 는 최상위 식 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입니다.


2
나는 이것을 좋아한다. 현재 누군가가 이미 pydoc과 같은 기능을 수행하지만 모듈을 가져 오지 않는 도구를 작성했는지 확인하려고합니다. 지금까지 이것은 내가 찾은 가장 좋은 예입니다 :)
James Mills

이 답변에 동의했습니다. 대상 파일을 가져올 수 있거나 작성된 Python 버전에 관계 없이이 기능이 작동해야합니다. 이것은 imp 및 importlib이 가져 오는 가져 오기 문제에 영향을 미치지 않습니다.
Eric Evans

모듈 변수 __version__등 은 어떻습니까 ? 그것을 얻는 방법이 있습니까?
frakman1

29

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

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

import inspect

import <module_to_inspect> as module

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

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

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


철자 해 주셔서 감사합니다. 모듈에서 가져 오기를 실행하여 검사 할 수 있다면 이것이 정답이라고 생각합니다.
Jonathan 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__요법). 이러한 이유로 공개 목록과 함께 나열하는 것은 유용하지 않을 수 있습니다 (Python은을 사용할 때 무엇을 얻을 수 있는지 알고 있습니다 from module import *).

__all__이 문제를 해결하는 데 사용될 수 있으면 모듈의 모든 공용 함수 및 클래스 목록 ( 밑줄로 시작 하지 않는 - _)을 반환합니다 . 누군가 파이썬에서 __all__을 설명 할 수 있습니까?를 참조하십시오 . 의 사용을 위해 __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']
>>>

밑줄이있는 모든 함수와 클래스는 제거되었으며 public으로 정의되어 따라서를 통해 사용할 수있는 것만 남습니다 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을
- 수입 모듈 이름
- 타입의 모듈 이름을 눌러 탭을. 파이썬 모듈의 모든 기능을 나열하는 작은 창이 열립니다.
매우 깔끔해 보입니다.

다음은 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
고마워요 다음과 같은 단선 대안을 제안합니다.[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
아민

0

다음 방법을 사용하여 쉘에서 모듈의 모든 기능을 나열 할 수 있습니다.

import module

module.*?

1
@GabrielFair 어떤 버전 / 플랫폼에서 파이썬을 실행하고 있습니까? 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.