Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Truques do IPython

Truques do IPython

Palestra minha e do Valdir Stumm (@stummjr) sobre truques e configurações que usamos para o IPython.

Elias Dorneles

January 20, 2016
Tweet

More Decks by Elias Dorneles

Other Decks in Programming

Transcript

  1. Configurando para parecer o shell Python padrão $ ipython profile

    create [ProfileCreate] Generating default config file: u'~/. ipython/profile_default/ipython_config.py' $ vim ~/.ipython/profile_default/ipython_config.py c = get_config() c.TerminalIPythonApp.display_banner = False c.TerminalInteractiveShell.colors = 'Linux' c.TerminalInteractiveShell.separate_in = '' c.TerminalInteractiveShell.confirm_exit = False c.TerminalInteractiveShell.term_title = True c.PromptManager.out_template = '' c.PromptManager.in2_template = ' ' c.PromptManager.in_template = '>>> ' $ ipython >>> print '\o/' \o/
  2. Autocomplete na importação >>> from json import <TAB> JSONDecoder _default_encoder

    dumps loads JSONEncoder decoder encoder scanner _default_decoder dump load tool >>> from json import dump<TAB> dump dumps >>> from xml.<TAB> xml.dom xml.etree xml.parsers xml.sax >>> from xml.dom.<TAB> xml.dom.NodeFilter xml.dom.expatbuilder xml.dom.minidom xml.dom.xmlbuilder xml.dom.domreg xml.dom.minicompat xml.dom.pulldom Atenção: o IPython de fato importa o módulo!
  3. Autocomplete em listas e retorno de funções >>> l =

    ["hello", [1, 2, 3]] >>> l[0].<TAB> l[0].capitalize l[0].isalnum l[0].lstrip l[0].splitlines l[0].center l[0].isalpha l[0].partition l[0].startswith l[0].count l[0].isdigit l[0].replace l[0].strip l[0].decode l[0].islower l[0].rfind l[0].swapcase l[0].encode l[0].isspace l[0].rindex l[0].title ... >>> l[1].<TAB> l[1].append l[1].extend l[1].insert l[1].remove l[1].sort l[1].count l[1].index l[1].pop l[1].reverse >>> '1,2,3'.split(',').<TAB> '1,2,3'.split(',').append '1,2,3'.split(',').pop '1,2,3'.split(',').count '1,2,3'.split(',').remove '1,2,3'.split(',').extend '1,2,3'.split(',').reverse ... Habilitar completação gulosa no profile: c.IPCompleter.greedy = True Atenção: a completação gulosa executa o código!
  4. Autocomplete em chaves de dicionários >>> d = { 'url':

    'http://news.ycombinator.com', 'title': 'Hacker News', 'last_visit': '2016-01-17' } >>> d[<TAB> d['last_visit'] d['title'] d['url'] >>> d['ur<TAB>l'] 'http://news.ycombinator.com'
  5. Use objeto? para ver a docstring dele >>> import os

    >>> os.path.join? Type: function String form: <function join at 0x7f8bb58a4f50> File: /usr/lib/python2.7/posixpath.py Definition: os.path.join(a, *p) Docstring: Join two or more pathname components, inserting '/' as needed. If any component is an absolute path, all previous path components will be discarded. An empty last part will result in a path that ends with a separator. >>>
  6. Use objeto?? para ver o código-fonte >>> os.path.join?? Type: function

    String form: <function join at 0x7f8bb58a4f50> File: /usr/lib/python2.7/posixpath.py Definition: os.path.join(a, *p) Source: def join(a, *p): """Join two or more pathname components, inserting '/' as needed. If any component is an absolute path, all previous path components will be discarded. An empty last part will result in a path that ends with a separator.""" path = a for b in p: <... resto do código omitido ...>
  7. Já alguma vez rodou de novo a linha anterior, só

    pra jogar o resultado pra uma variável?
  8. Utilizando resultados anteriores >>> 12 + 22 34 >>> 13

    + 9 + 4 26 >>> _ + __ 60 >>> resultado = _ # não precisa mais re-rodar o código =)
  9. Tem também uma cache global... >>> 12 + 22 34

    >>> 13 + 9 + 4 26 >>> _ + __ 60 >>> resultado = _ # não precisa mais re-rodar o código =) >>> _1 34 >>> _2 26
  10. Mas a gente não gosta, preferimos o prompt limpo ...

    e a memória também =) c.TerminalInteractiveShell.cache_size = 0 A configuração acima desabilita _<NUMERO> _, __ e ___ continuarão funcionando Ref: https://ipython.org/ipython-doc/3/interactive/reference.html#output-caching-system
  11. %timeit e %time >>> lista = list(range(1000)) >>> %timeit map(str,

    lista) 10000 loops, best of 3: 74.5 µs per loop >>> %timeit [str(l) for l in lista] 10000 loops, best of 3: 121 µs per loop >>> >>> import math >>> %time math.sqrt(3.456) CPU times: user 0 ns, sys: 0 ns, total: 0 ns Wall time: 13.1 µs 1.85903200617956 Ou, como vencer uma discussão inútil sobre otimização prematura %time roda só uma vez e mostra o resultado (igual o time do shell do sistema)
  12. %hist >>> import os >>> bashrc = os.path.expanduser('~/. bashrc') >>>

    open(bashrc, 'w').write('echo muhaha') >>> %hist import os bashrc = os.path.expanduser('~/. bashrc') open(bashrc, 'w').write('echo muhaha') %hist >>> %hist -f arquivo.py >>> # ou ainda: >>> %save arquivo.py 1-3 Hm, na verdade eu queria criar um script pra isso que tô fazendo... (ou jogar para uns slides ;-)
  13. Comandos que (re-)descobrimos preparando os slides • %lsmagic ◦ Lista

    as funções mágicas disponíveis • %quickref ◦ Mostra referência rápida de comandos do IPython • %edit ◦ Abre editor com arquivo temporário pra digitar o código e executar depois • %autoindent ◦ habilita/desabilita indentação automática • %run arquivo.py ◦ Roda comandos em arquivo.py
  14. Colando direto no terminal - o problema >>> def loop_duplo(collection):

    ...: for e in collection: ...: print(e) ...: for e in collection: ...: print(e) ...: File "<ipython-input-8-17a426f52fc3>", line 4 for e in collection: ^ IndentationError: unindent does not match any outer indentation level If you want to paste code into IPython, try the %paste and %cpaste magic functions. >>>
  15. Colando direto no terminal - a solução >>> %paste def

    loop_duplo(collection): for e in collection: print(e) for e in collection: print(e) ## -- End pasted text -- >>>
  16. Colando direto no terminal - a solução (2a versão) >>>

    %autoindent Automatic indentation is: OFF >>> def loop_duplo(collection): ....: for e in collection: ....: print(e) ....: for e in collection: ....: print(e) ....: >>>
  17. Colando direto no terminal - a solução (3a versão) >>>

    %cpaste Pasting code; enter '--' alone on the line to stop or use Ctrl-D. :
  18. Colando direto no terminal - a solução (3a versão) >>>

    %cpaste Pasting code; enter '--' alone on the line to stop or use Ctrl-D. :def loop_duplo(collection): : for e in collection: : print(e) : for e in collection: : print(e) : :<EOF> >>>
  19. Colando trechos copiados de outra sessão IPython >>> >>> import

    math >>> >>> for n in [9, 6, 25]: ....: ...: print(math.sqrt(n)) ....: ...: 3.0 2.44948974278 5.0 >>> Repare como ele ignorou a marcação extra gerada na outra sessão
  20. Rode hash -r após instalar o IPython em um virtualenv

    (env)$ ipython WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv. (env)$ pip install ipython (env)$ ipython WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv. (env)$ hash -r (env)$ ipython >>> print "Yay!" Yay! Atualiza as referências aos programas conhecidos pelo shell.
  21. Saída pode ser atribuída a uma variável, sendo representado como

    uma espécie de lista Exclamação ! antes do comando >>> !ls a.out file1.txt file2.txt >>> files = !ls >>> files ['a.out', 'file1.txt', 'file2.txt'] >>> files.s 'a.out file1.txt file2.txt' >>> files.grep('\d') ['file1.txt', 'file2.txt']
  22. Cole esta linha em qualquer lugar no seu programa: from

    IPython import embed; embed() TA-DAM! Um shell com as variáveis locais naquele momento. =)