Pergunta

Eu tenho um módulo python instalado no meu sistema e eu gostaria de ser capaz de ver o que estão disponíveis nele funções / classes / métodos.

Eu quero chamar a função doc em cada um. Em Ruby eu posso fazer algo como ClassName.methods para obter uma lista de todos os métodos disponíveis nessa classe. Existe algo semelhante em python?

por exemplo. algo como:

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

Solução

O inspect módulo. veja também a pydoc módulo, a função help() no interpretador interativo eo pydoc ferramenta de linha de comando que gera a documentação que você está depois. Você pode apenas dar-lhes a classe que você deseja ver a documentação da. Eles também podem gerar, por exemplo, a saída HTML e escrevê-lo em disco.

Outras dicas

Você pode usar dir(module) para ver todos os métodos / atributos disponíveis. Também check out PyDocs.

Uma vez que você imported o módulo, você pode apenas fazer:

 help(modulename)

... Para obter a documentação sobre todas as funções de uma vez, de forma interativa. Ou você pode usar:

 dir(modulename)

... Para listar apenas os nomes de todas as funções e variáveis ??definidas no módulo.

Um exemplo com inspecionar:

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 retorna uma lista de (object_name, object_type) tuplas.

Você pode substituir isfunction com qualquer uma das outras funções isXXX na inspecionar módulo.

import types
import yourmodule

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

Para completar bem, eu gostaria de salientar que às vezes você pode querer parse código em vez de importá-lo. Um import irá executar expressões de nível superior, e que poderia ser um problema.

Por exemplo, eu estou deixando os usuários selecionar as funções de ponto de entrada para os pacotes que estão sendo feitas com zipapp . Usando import e inspect corre o risco de código perdido, levando a falhas, mensagens de ajuda que está sendo impresso, diálogos GUI aparecendo e assim por diante.

Em vez disso, use o ast módulo para listar todos os funções de nível superior:

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)

Colocar esse código em list.py e utilizando-se como entrada, eu recebo:

$ python list.py list.py
list.py
  top_level_functions
  parse_ast

É claro, navegar um AST pode ser complicado às vezes, até mesmo para uma linguagem relativamente simples como Python, porque a AST é bastante baixo nível. Mas se você tem uma simples e clara caso de uso, é tanto factível e seguro.

No entanto, a desvantagem é que você não pode detectar funções que são gerados em tempo de execução, como foo = lambda x,y: x*y.

Isto irá fazer o truque:

dir(module) 

No entanto, se você achar que é chato de ler a lista retornada, basta usar o seguinte loop para obter um nome por linha.

for i in dir(module): print i

dir(module) é a maneira padrão ao usar um script ou o intérprete padrão, como mencionado na maioria das respostas.

No entanto, com um shell interativo do Python como IPython você pode usar guia-conclusão para obter uma visão geral de todos os objetos definidos no módulo. Isso é muito mais conveniente, do que usar um script e print para ver o que está definido no módulo.

  • module.<tab> irá mostrar-lhe todos os objetos definidos no módulo (funções, classes e assim por diante)
  • module.ClassX.<tab> irá mostrar-lhe os métodos e atributos de uma classe
  • module.function_xy? ou module.ClassX.method_xy? irá mostrar-lhe o docstring dessa função / método
  • module.function_x?? ou module.SomeClass.method_xy?? irá mostrar-lhe o código-fonte da função / método.

Para código que você não deseja analisar, eu recomendo a abordagem baseada em AST de @csl acima.

Para tudo o resto, a inspecionar módulo é correto:

import inspect

import <module_to_inspect> as module

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

Isto dá uma lista de 2-tuplas na [(<name:str>, <value:function>), ...] formulário.

A resposta simples acima é sugerida em várias respostas e comentários, mas não chamou explicitamente.

Para funções globais dir() é o comando para uso (como mencionado na maioria destas respostas), porém este listas ambas as funções públicas e funções não-públicos juntos.

Por exemplo em execução:

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

Retorna funções / classes como:

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

Alguns dos quais geralmente não são destinados para uso programação geral (mas pelo próprio módulo, exceto no caso de DunderAliases como __doc__, __file__ ect). Por esta razão, não pode ser útil para listá-los com as públicas (isto é como Python sabe que para chegar ao usar from module import *).

__all__ poderia ser usado para resolver este problema, ele retorna uma lista de todas as funções públicas e classes em um módulo (aqueles que não começar com sublinhados - _). Vejo alguém pode explicar __all__ em Python? para o uso de __all__.

Aqui está um exemplo:

>>> 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']
>>>

Todas as funções e classes com sublinhados foram removidas, deixando apenas aqueles que são definidos como público e, portanto, pode ser usado via import *.

Note que __all__ não é sempre definido. Se ele não está incluído em seguida, um AttributeError é levantada.

Um caso de isso é com o módulo ast:

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

Nenhuma dessas respostas vai funcionar se você não conseguir importar disse arquivo Python sem erros de importação. Este foi o caso para mim quando eu estava inspecionando um arquivo que vem de uma grande base de código com um monte de dependências. A seguir irá processar o arquivo como texto e pesquisa para todos os nomes de métodos que começam com "def" e imprimi-los e os seus números de linha.

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])

Com exceção dir (módulo) ou ajuda (módulo) mencionado em respostas anteriores, você pode também tentar:
- Open ipython
- importação module_name
- Tipo de module_name, guia imprensa. Ele vai abrir uma pequena janela com lista de todas as funções no módulo python.
Parece muito arrumado.

Aqui está snippet listando todas as funções do módulo 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

Você pode usar o método a seguir a lista obtenha todas as funções em seu módulo de shell:

import module

module.*?

Isto irá anexar todas as funções que são definidas no your_module em uma lista.

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

Não é (ou pelo menos não) adequada para usar dir (módulo). O código deve ler como este:

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

Ou você especificar o módulo que deseja assim: dir('sys') para produzir resultados das sys nome do módulo. dir() retorna erros enquanto dir('') é o que você precisa. * Ajuda ( '') irá retornar informações de ajuda se disponível para a maioria das funções. por exemplo; help('modules') voltará módulo de controlo de ajuda.

Obrigado por todos os votos para baixo. Eu estava usando Python3.2.2 e outras versões 3x quando eu postei isso. O objetivo era usar ( 'coisas') em vez do anterior (coisas). Mas eu estou assumindo que o seu todo preso em python2 ou usando versões mais recentes para PC não móvel como eu era.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top