문제

내 시스템에 Python 모듈이 설치되어 있고 그 모듈에서 어떤 기능/클래스/메서드를 사용할 수 있는지 확인하고 싶습니다.

각각에 대해 doc 함수를 호출하고 싶습니다.Ruby에서는 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모듈을 ed, 당신은 그냥 할 수 있습니다 :

 help(modulename)

... 한 번에 모든 기능에 대한 문서를 대화식으로 얻으려면. 또는 사용할 수 있습니다.

 dir(modulename)

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

검사의 예 :

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) 튜플 목록을 반환합니다.

ISFunction을 검사 모듈의 다른 ISXXX 기능으로 바꿀 수 있습니다.

import types
import yourmodule

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

완전성을 위해, 나는 때때로 당신이 원할 수도 있다고 지적하고 싶습니다. 구문 분석 가져 오는 대신 코드. an 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는 매우 낮기 때문입니다. 그러나 간단하고 명확한 사용 사례가 있다면 가능하고 안전합니다.

그러나 단점은 런타임에 생성 된 기능을 감지 할 수 없다는 것입니다. foo = lambda x,y: x*y.

이것은 트릭을 수행 할 것입니다.

dir(module) 

그러나 반환 된 목록을 읽는 것이 성가신 경우 다음 루프를 사용하여 한 줄 당 하나의 이름을 얻으십시오.

for i in dir(module): print i

dir(module) 대부분의 답변에 언급 된대로 스크립트 또는 표준 통역사를 사용할 때 표준 방식입니다.

그러나 대화식 파이썬 쉘과 같은 IPYTHON 탭 완성을 사용하여 모듈에 정의 된 모든 개체의 개요를 얻을 수 있습니다. 이것은 스크립트를 사용하는 것보다 훨씬 편리합니다. print 모듈에 정의 된 내용을 확인합니다.

  • module.<tab> 모듈에 정의 된 모든 객체를 보여줍니다 (함수, 클래스 등)
  • module.ClassX.<tab> 클래스의 방법과 속성을 보여줄 것입니다.
  • module.function_xy? 또는 module.ClassX.method_xy? 해당 함수 / 메소드의 문서를 보여줄 것입니다.
  • module.function_x?? 또는 module.SomeClass.method_xy?? 함수 / 메소드의 소스 코드를 표시합니다.

구문 분석하고 싶지 않은 코드의 경우 위의 @CSL의 AST 기반 접근 방식을 권장합니다.

다른 모든 것에 대해 검사 모듈이 정확합니다.

import inspect

import <module_to_inspect> as module

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

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

위의 간단한 답변은 다양한 응답과 의견으로 암시되지만 명시 적으로 불려지는 것은 아닙니다.

글로벌 기능을 위해 dir() 대부분의 답변에 언급 된대로 사용하는 명령이지만, 여기에는 공개 기능과 비 공개 기능이 함께 나열됩니다.

예를 들어 실행 :

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

다음과 같은 기능/클래스를 반환합니다.

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

그 중 일부는 일반적으로 일반적인 프로그래밍 사용을위한 것이 아닙니다 (그러나 Dunderalias의 경우를 제외하고는 모듈 자체에 의해 __doc__, __file__ ect). 이런 이유로 공개적으로 나열하는 것이 유용하지 않을 수 있습니다 (이것은 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']
>>>

밑줄이있는 모든 기능과 클래스가 제거되었으며 공개로 정의 된 기능 만 남겨두고 import *.

주목하십시오 __all__ 항상 정의 된 것은 아닙니다. 포함되지 않은 경우 An AttributeError 제기됩니다.

이것의 사례는 AST 모듈입니다.

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

가져 오기 오류없이 상기 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])

이전 답변에서 언급한 dir(module) 또는 help(module)을 제외하고 다음을 시도해 볼 수도 있습니다.
- 아이파이썬 열기
- import module_name
- module_name을 입력하고 Tab을 누릅니다.Python 모듈의 모든 기능을 나열하는 작은 창이 열립니다.
매우 깔끔해 보입니다.

다음은 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

다음 방법을 사용하여 모듈의 모든 기능을 표시 할 수 있습니다.

import module

module.*?

이것은 목록의 your_module에 정의 된 모든 함수를 추가합니다.

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

DIR (모듈)을 사용하는 것이 적절하지 않습니다 (또는 더 이상). 코드는 다음과 같이 읽어야합니다.

dir('module') or dir('modules') 

또는 다음과 같은 모듈을 지정합니다. dir('sys') 모듈 이름 SYS에서 결과를 생성합니다. dir() 중 오류를 반환합니다 dir('') 당신이 필요로하는 것입니다. *HELP ( '')는 대부분의 기능에 사용할 수있는 경우 도움말 정보를 반환합니다. 예를 들어; help('modules') 모듈 도움말 정보를 반환합니다.

모든 다운 투표에 감사드립니다. 이 글을 올렸을 때 Python3.2.2 및 기타 3X 버전을 사용하고있었습니다. 요점은 이전 (재료) 대신 ( 'stuff')를 사용하는 것이 었습니다. 그러나 나는 당신의 모든 것이 Python2에 붙어 있거나 나처럼 모바일이 아닌 PC에 최신 버전을 사용한다고 가정합니다.

http://effbot.org/librarybook/sys.htm

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top