Question

J'utilise la coque Python dans un terminal Tty, et il est extrêmement irritant que toute la documentation s'enroule à une largeur aussi étroite. Mon écran est de 1600 à 900 pixels, avec mon terminal à 200 par 56 caractères, mais la documentation Python de la coquille insiste pour s'envelopper à une largeur beaucoup plus étroite. (Les lignes que j'entre à l'invite ne sont pas limitées; cela leur permet d'exécuter la largeur du plein écran.)

Je suis conscient que PEP-8 Longueur de ligne maximale Spécifie que les docstrings sont limités à 72 caractères par ligne, mais existe-t-il un moyen de le faire utiliser tout le terminal entier? Je sais que Javadoc supprime l'emballage de ligne supplémentaire des commentaires de Javadoc; Je suis après quelque chose qui fonctionne un peu comme ça.

Le plus gros problème avec cela est la liste des modules: au lieu d'utiliser toute la largeur de mon écran lorsqu'elle répertorie tous les noms de modules, il n'utilise que la largeur de wrap étroite, affichant les modules en quatre colonnes uniquement, et donc il ne peut pas réellement Montez toute la liste sur mon écran (bien qu'il s'adapte parfaitement aux autres moniteurs). Je ne peux pas simplement le tuer à travers less Soit, comme je le fais avec surdimension --help Texte en bash.

Était-ce utile?

La solution

== edit == mis à jour

Ainsi, le problème que vous rencontrerez est que pour l'aide basée sur la CLI, la largeur de la chaîne DOC n'est vraiment limitée que par les Newlines dans la documentation d'origine. C'est-à-dire, lorsque vous exécutez de l'aide (avenir) ', il imprime simplement la chaîne Doc et la pages. Rien d'extraordinaire, pas de formatage fait à la volée. C'est pourquoi si vous rendez le DOC à HTML, vous pouvez modifier la largeur du navigateur et il s'enroulera différemment.

La seule façon dont j'ai trouvé pour modifier ce comportement est si vous modifiez réellement le docstring lui-même.

Voici un exemple rapide de la façon de Monkey-Patch Doc Strings. Essentiellement dans un docstring, les Newlines sont codées à la fin de la ligne, telles que

a = """
one
two

three
"""

Code dans

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

Si vous vouliez automatiquement la ligne «enveloppe», il vous suffit de remplacer n [^ n] (tout caractère Newline + qui n'est pas une nouvelle ligne) par le caractère capturé.

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

A devient alors

' one two\n three\n'

C'est une façon super hacky de faire les choses, mais la seule façon à penser à reformater les choses pour qu'ils s'enroulent.

Un meilleur exemple serait:

#!/usr/bin/python

import pydoc
import re

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

== edit ==

Cela peut ou non répondre à vos besoins, mais j'ai eu un reproche similaire que j'ai résolu un peu différemment. J'ai écrit un emballage «d'aide» qui charge les documents Stdlib dans un navigateur en arrière-plan. Cela peut ou non vous aider - une bonne chose est que la sortie HTML des trucs PYDOC permet des largeurs variables sur les paragraphes.

Vous pouvez prendre le script ci-joint, l'importer sur site.py, puis lorsque vous exécutez l'aide () à partir de la CLI sur n'importe quel truc stdlib, il ouvrira automatiquement la page Web correspondante. Cela ne fait rien pour vos propres trucs locaux (je ne pense pas, ça fait un moment), mais pourrait être modifié pour le faire.

Si vous êtes hardcore CLI Guy, excuses. Mais face à un reproche similaire en ce qui concerne la sortie des choses, c'est ce que j'ai initialement essayé.

#!/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()

La deuxième solution que j'utilise pour obtenir de jolis documents Python est d'utiliser Sphinx sphinx-apidoc Pour générer automatiquement des documents API pour les modules Python. Les trucs de sortie de Doc Python standard sont vraiment limitatifs (comme vous vivez).

Cependant, cela dit - je parie que la largeur pour les documents est configurable d'une manière ou d'une autre, mais nécessitera du correctif de singe ... Je vais piquer un peu et voir ce que je peux trouver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top