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. Truques do IPython
    @eliasdorneles, @stummjr
    pythonhelp.wordpress.com

    View Slide

  2. NÃO vamos falar do IPython Notebook!

    View Slide

  3. Configurando para parecer o shell Python padrão
    X

    View Slide

  4. 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/

    View Slide

  5. Autocompletes

    View Slide

  6. Autocomplete na importação
    >>> from json import
    JSONDecoder _default_encoder dumps loads
    JSONEncoder decoder encoder scanner
    _default_decoder dump load tool
    >>> from json import dump
    dump dumps
    >>> from xml.
    xml.dom xml.etree xml.parsers xml.sax
    >>> from xml.dom.
    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!

    View Slide

  7. Autocomplete em listas e retorno de funções
    >>> l = ["hello", [1, 2, 3]]
    >>> l[0].
    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].
    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(',').
    '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!

    View Slide

  8. Autocomplete em chaves de dicionários
    >>> d = {
    'url': 'http://news.ycombinator.com',
    'title': 'Hacker News',
    'last_visit': '2016-01-17'
    }
    >>> d[
    d['last_visit'] d['title'] d['url']
    >>> d['url']
    'http://news.ycombinator.com'

    View Slide

  9. Docstrings e código-
    fonte na ponta dos
    dedos!

    View Slide

  10. Use objeto? para ver a docstring dele
    >>> import os
    >>> os.path.join?
    Type: function
    String form:
    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.
    >>>

    View Slide

  11. Use objeto?? para ver o código-fonte
    >>> os.path.join??
    Type: function
    String form:
    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:

    View Slide

  12. Já alguma vez rodou de novo a linha
    anterior, só pra jogar o resultado pra
    uma variável?

    View Slide

  13. Utilizando resultados anteriores
    >>> 12 + 22
    34
    >>> 13 + 9 + 4
    26
    >>> _ + __
    60
    >>> resultado = _ # não precisa mais re-rodar o código =)

    View Slide

  14. 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

    View Slide

  15. 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 _
    _, __ e ___ continuarão funcionando
    Ref: https://ipython.org/ipython-doc/3/interactive/reference.html#output-caching-system

    View Slide

  16. Comandos mágicos!
    >>> %comando

    View Slide

  17. %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)

    View Slide

  18. View Slide

  19. %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 ;-)

    View Slide

  20. 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

    View Slide

  21. Colando no IPython

    View Slide

  22. Colando direto no terminal - o problema
    >>> def loop_duplo(collection):
    ...: for e in collection:
    ...: print(e)
    ...: for e in collection:
    ...: print(e)
    ...:
    File "", 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.
    >>>

    View Slide

  23. 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 --
    >>>

    View Slide

  24. 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)
    ....:
    >>>

    View Slide

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

    View Slide

  26. 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)
    :
    :
    >>>

    View Slide

  27. Também dá pra
    copiar e colar direto
    de outra sessão
    IPython

    View Slide

  28. 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

    View Slide

  29. Usando IPython
    em virtualenvs

    View Slide

  30. 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.

    View Slide

  31. Usando o shell do
    sistema sem sair do
    IPython

    View Slide

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

    View Slide

  33. IPython pra inspecionar
    o código

    View Slide

  34. 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. =)

    View Slide

  35. Perguntas?
    Obrigado!
    @eliasdorneles
    @stummjr
    http://pythonhelp.wordpress.com

    View Slide