{ "metadata": { "name": "Capitulo14_Introspeccao" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Cap\u00edtulo 14: Introspec\u00e7\u00e3o\n", "=============================\n", "_____________________________\n", "Introspec\u00e7\u00e3o ou reflex\u00e3o \u00e9 capacidade do software de identificar e relatar suas pr\u00f3prias estruturas internas, tais como tipos, escopo de vari\u00e1veis, m\u00e9todos e atributos.\n", "\n", "Fun\u00e7\u00f5es nativas do interpretador para introspec\u00e7\u00e3o:\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Fun\u00e7\u00e3oRetorno
type(objeto)O tipo (classe) do objeto
id(objeto)O identificador do objeto
locals()O dicion\u00e1rio de vari\u00e1veis locais
globals()O dicion\u00e1rio de vari\u00e1veis globais
vars(objeto)O dicion\u00e1rio de s\u00edmbolos do objeto
len(objeto)O tamanho do objeto
dir(objeto)A lista de estruturas do objeto
help(objeto)As Doc Strings do objeto
repr(objeto)A representa\u00e7\u00e3o do objeto
isinstance(objeto, classe)Verdadeiro se objeto deriva da classe
issubclass(subclasse, classe)Verdadeiro se subclasse herda classe
\n", "\n", "O identificador do objeto \u00e9 um n\u00famero inteiro \u00fanico que \u00e9 usado pelo interpretador para identificar internamente os objetos.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Colhendo algumas informa\u00e7\u00f5es\n", "# dos objetos globais no programa\n", "\n", "from types import ModuleType\n", "\n", "def info(n_obj):\n", "\n", " # Cria uma refer\u00eancia ao objeto\n", " obj = globals()[n_obj]\n", "\n", " # Mostra informa\u00e7\u00f5es sobre o objeto\n", " print 'Nome do objeto:', n_obj\n", " print 'Identificador:', id(obj)\n", " print 'Tipo:', type(obj)\n", " print 'Representa\u00e7\u00e3o:', repr(obj)\n", "\n", " # Se for um m\u00f3dulo\n", " if isinstance(obj, ModuleType):\n", " print 'itens:'\n", " for item in dir(obj):\n", " print item\n", " print\n", "\n", "# Mostrando as informa\u00e7\u00f5es\n", "for n_obj in dir()[:10]: # O trecho [:10] \u00e9 apenas para limitar os objetos\n", " info(n_obj)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Nome do objeto: ALLOW_THREADS\n", "Identificador: 31976616\n", "Tipo: \n", "Representa\u00e7\u00e3o: 1\n", "\n", "Nome do objeto: Annotation\n", "Identificador: 52522064\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n", "Nome do objeto: Arrow\n", "Identificador: 49643312\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n", "Nome do objeto: Artist\n", "Identificador: 48410704\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n", "Nome do objeto: AutoLocator\n", "Identificador: 49376208\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n", "Nome do objeto: Axes\n", "Identificador: 55538128\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n", "Nome do objeto: BUFSIZE\n", "Identificador: 37513920\n", "Tipo: \n", "Representa\u00e7\u00e3o: 8192\n", "\n", "Nome do objeto: Button\n", "Identificador: 51026320\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n", "Nome do objeto: CLIP\n", "Identificador: 31976640\n", "Tipo: \n", "Representa\u00e7\u00e3o: 0\n", "\n", "Nome do objeto: Circle\n", "Identificador: 49578336\n", "Tipo: \n", "Representa\u00e7\u00e3o: \n", "\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "O Python tamb\u00e9m tem um m\u00f3dulo chamado *types*, que tem as defini\u00e7\u00f5es dos tipos b\u00e1sicos do interpretador.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import types\n", "\n", "s = ''\n", "if isinstance(s, types.StringType):\n", " print 's \u00e9 uma string.'" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "s \u00e9 uma string.\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Atrav\u00e9s da introspec\u00e7\u00e3o, \u00e9 poss\u00edvel determinar os campos de uma tabela de banco de dados, por exemplo.\n", "\n", "Inspect\n", "-------\n", "O m\u00f3dulo *inspect* prov\u00ea um conjunto de fun\u00e7\u00f5es de alto n\u00edvel para introspec\u00e7\u00e3o que permitem investigar tipos , itens de cole\u00e7\u00f5es, classes, fun\u00e7\u00f5es, c\u00f3digo fonte e a pilha de execu\u00e7\u00e3o do interpretador.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import os.path\n", "# inspect: m\u00f3dulo de introspec\u00e7\u00e3o \"amig\u00e1vel\"\n", "import inspect\n", "\n", "print 'Objeto:', inspect.getmodule(os.path)\n", "\n", "print 'Classe?', inspect.isclass(str)\n", "\n", "# Lista todas as fun\u00e7\u00f5es que existem em \"os.path\"\n", "\n", "print 'Membros:',\n", "\n", "for name, struct in inspect.getmembers(os.path):\n", "\n", " if inspect.isfunction(struct):\n", " print name, " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Objeto: \n", "Classe? True\n", "Membros: _joinrealpath abspath basename commonprefix dirname exists expanduser expandvars getatime getctime getmtime getsize isabs isdir isfile islink ismount join lexists normcase normpath realpath relpath samefile sameopenfile samestat split splitdrive splitext walk\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As fun\u00e7\u00f5es que trabalham com a pilha do interpretador devem ser usadas com cuidado, pois \u00e9 poss\u00edvel criar refer\u00eancias c\u00edclicas (uma vari\u00e1vel que aponta para o item da pilha que tem a pr\u00f3pria vari\u00e1vel). A exist\u00eancia de refer\u00eancias a itens da pilha retarda a destrui\u00e7\u00e3o dos itens pelo coletor de lixo do interpretador." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }