Python 모듈의 모든 함수를 나열하는 방법은 무엇입니까?
-
02-07-2019 - |
문제
내 시스템에 Python 모듈이 설치되어 있고 그 모듈에서 어떤 기능/클래스/메서드를 사용할 수 있는지 확인하고 싶습니다.
각각에 대해 doc 함수를 호출하고 싶습니다.Ruby에서는 ClassName.methods와 같은 작업을 수행하여 해당 클래스에서 사용할 수 있는 모든 메서드 목록을 얻을 수 있습니다.파이썬에도 비슷한 것이 있나요?
예.다음과 같은 것:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
다른 팁
당신이 사용할 수있는 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에 최신 버전을 사용한다고 가정합니다.