Pergunta

Eu estou usando o python shell em um terminal TTY, e é extremamente irritante que toda a documentação é moldado como uma largura estreita.Minha tela é de 1.600 por 900 pixels, com a minha terminal de 200 por 56 caracteres, mas a documentação python a partir da shell, insiste no embrulho em uma largura menor.(As linhas que eu digite no prompt não estão limitados;ele permite executar a largura de ecrã completo.)

Estou ciente de que PEP-8 Comprimento Máximo da Linha especifica que docstrings ser limitada a 72 caracteres por linha, mas há uma maneira de obtê-lo a usar todo o terminal de qualquer maneira?Eu sei javadoc remove extra quebra de linha javadoc comentários;Eu quero algo que funciona um pouco assim.

O maior problema com este é o módulo lista:em vez de usar toda a largura da tela quando ele lista todos os nomes de módulo, ele usa apenas o estreito envoltório de largura, mostrando os módulos em quatro colunas só, e por isso não pode realmente caber toda a lista na minha tela (embora ele se encaixa perfeitamente em outros monitores).Eu não sou capaz de canalizá-lo através de less ou, como eu faço com grandes --help texto em bash.

Foi útil?

Solução

== Edit == Atualizada

Portanto, o problema é que você verá é que, para a CLI de ajuda, a doc string largura realmente é limitado apenas pela mudança de linha na documentação original.Isto é, quando você executar o 'ajuda(futuro)', apenas imprime o documento de seqüência de caracteres e páginas.Nada extravagante, sem formatação feito em tempo real.É por isso que se você processar o doc para HTML, você pode modificar o navegador de largura e vai moldar de forma diferente.

A única forma que eu encontrei para modificar este comportamento é, se você realmente modificar a docstring si.

Aqui está um exemplo rápido de como macaco-patch doc strings.Essencialmente, em uma docstring, as quebras de linha são codificados para o final da linha, tal que

a = """
one
two

three
"""

Codifica em

'\none\ntwo\n\nthree\n'

Se você queria 'wrap' linha automaticamente, você só precisa substituir [^ ] (qualquer newline + caractere que não seja um newline) com o personagem capturado.

re.sub('\n([^\n])', ' \g<1>', a)

um, em seguida, torna-se

' one two\n three\n'

Este é um super hacky maneira de fazer as coisas, mas a única maneira que eu posso pensar para reformatar as coisas de modo que eles tecem.

Um exemplo melhor seria:

#!/usr/bin/python

import pydoc
import re

t = re.sub('\n([^\n])', ' \g<1>', pydoc.__doc__)
pydoc.__doc__ = t
help(pydoc)

== Edit ==

Isso pode ou não pode atender às suas necessidades, mas eu tinha um semelhante queixa que eu resolvi de maneira um pouco diferente.Eu escrevi uma 'ajuda' wrapper que carrega stdlib documentos em um navegador em segundo plano.Ele pode ou não pode ajudar - uma coisa boa é que o HTML de saída de pydoc coisas permite larguras variáveis em parágrafos.

Você pode tirar o script anexado, importá-lo a partir de site.py e então, quando você executar a ajuda de() a partir da CLI em qualquer stdlib coisas, ele vai abrir a página da web automaticamente.Isso não faz nada para o seu próprio material local (eu não acho, tem sido um tempo), mas pode ser modificado para fazer isso.

Se você está hardcore CLI cara, desculpas.Mas, quando confrontado com a mesma queixa com relação à saída de material é isso que eu inicialmente tentou.

#!/usr/bin/python

import inspect
import os
import sys
import webbrowser
from pydoc import Helper

__all__ = ['MyHelper', 'old_help', 'help']


class MyHelper(Helper):

    def __init__(self):
        Helper.__init__(self)

    def getdocloc(self, object):
        global old_help
        """Return the location of module docs or None"""
        try:
            file = inspect.getabsfile(object)
        except TypeError:
            file = '(built-in)'

        docloc = os.environ.get("PYTHONDOCS", "http://docs.python.org/library")
        basedir = os.path.join(sys.exec_prefix, "lib", "python"+sys.version[0:3])
        BUILTINS_LIST = ( 'errno', 'exceptions', 'gc', 'imp', 'marshal', 'posix', 'signal', 'sys', 'thread', 'zipimport')
        if (isinstance(object, type(os)) and (object.__name__ in BUILTINS_LIST or file.startswith(basedir)) and object.__name__ not in ('xml.etree', 'test.pydoc_mod')):
            if docloc.startswith("http://"):
                docloc = "%s/%s" % (docloc.rstrip("/"), object.__name__)
            else:
                docloc = os.path.join(docloc, object.__name__ + ".html")
        else:
            docloc = None
        return docloc

    def __repr__(self):
        global old_help
        if inspect.stack()[1][3] == '?':
            return self()
            return ''
        else:
            return '<HHhelp instance>'

    def help(self, *args):
        print args
        global old_help
        if isinstance(args[0], object):
            docloc = self.getdocloc(args[0])
            print '********',docloc,type(docloc)
            if isinstance(docloc, str):
                if docloc.find('http://') == 0:
                    webbrowser.open(docloc)
        else: 
            old_help(args)

global old_help, help
old_help = help
help = MyHelper()

A segunda solução que eu uso para ficar bonita Python docs está usando o Sphinx esfinge-apidoc para gerar automaticamente API documentos para módulos Python.O padrão do Python, doc saída de material é muito limitante (como você está experimentando).

No entanto, com o que disse - eu aposto que a largura para docs é configurável, de alguma forma, mas vai exigir monkey patching...Vou fuçar um pouco e ver o que posso encontrar.

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