Разумное завершение строки исходного кода Python для распечатки

StackOverflow https://stackoverflow.com/questions/1035721

Вопрос

Я работаю над латексным документом, который потребует значительного набора исходного кода на python. Я использую фрагменты (модуль python, а не онлайн-демонстрацию) для инкапсуляции этого питона в латекс, который хорошо работает за исключением случая с длинными отдельными строками, которые просто продолжаются со страницы. Я мог бы обернуть эти строки вручную, за исключением того, что это не кажется мне элегантным решением, и я предпочитаю тратить время на размышления о сумасшедших автоматизированных решениях, чем на повторяющиеся задачи.

Я хотел бы, чтобы какой-то способ обработки исходного кода на python заключался в перенос строки до определенной максимальной длины символа при сохранении функциональности. Я поэкспериментировал с каким-то Python, и самое близкое, что я получил, это вставил \\\ n в последний пробел перед максимальной длиной строки - но, конечно, если это заканчивается строками и комментарии, вещи идут не так, как надо. Откровенно говоря, я не уверен, как подойти к этой проблеме.

Итак, кто-нибудь знает о модуле или инструменте, который может обрабатывать исходный код, чтобы ни одна строка не превышала определенной длины, или, по крайней мере, хороший способ начать писать что-то подобное?

Это было полезно?

Решение

Возможно, вы захотите немного расширить свой текущий подход, но с помощью токена Модуль из стандартной библиотеки, чтобы определить, где поставить разрывы строк. Таким образом, вы можете видеть фактические токены (COMMENT, STRING и т. Д.) Вашего исходного кода, а не только слова, разделенные пробелами.

Вот краткий пример того, что может делать токенизация:

>>> from cStringIO import StringIO
>>> from tokenize import tokenize
>>> 
>>> python_code = '''
... def foo(): # This is a comment
...     print 'foo'
... '''
>>> 
>>> fp = StringIO(python_code)
>>> 
>>> tokenize(fp.readline)
1,0-1,1:    NL  '\n'
2,0-2,3:    NAME    'def'
2,4-2,7:    NAME    'foo'
2,7-2,8:    OP  '('
2,8-2,9:    OP  ')'
2,9-2,10:   OP  ':'
2,11-2,30:  COMMENT '# This is a comment'
2,30-2,31:  NEWLINE '\n'
3,0-3,4:    INDENT  '    '
3,4-3,9:    NAME    'print'
3,10-3,15:  STRING  "'foo'"
3,15-3,16:  NEWLINE '\n'
4,0-4,0:    DEDENT  ''
4,0-4,0:    ENDMARKER   ''

Другие советы

Я использую пакет lists в LaTeX для вставки исходного кода; это делает подсветку синтаксиса, разрывы строк и др.

Добавьте в преамбулу следующее:

\usepackage{listings}
%\lstloadlanguages{Python} # Load only these languages
\newcommand{\MyHookSign}{\hbox{\ensuremath\hookleftarrow}}

\lstset{
    % Language
    language=Python,
    % Basic setup
    %basicstyle=\footnotesize,
    basicstyle=\scriptsize,
    keywordstyle=\bfseries,
    commentstyle=,
    % Looks
    frame=single,
    % Linebreaks
    breaklines,
    prebreak={\space\MyHookSign},
    % Line numbering
    tabsize=4,
    stepnumber=5,
    numbers=left,
    firstnumber=1,
    %numberstyle=\scriptsize,
    numberstyle=\tiny,
    % Above and beyond ASCII!
    extendedchars=true
}

В пакете есть хук для встроенного кода, включая целые файлы, показывающие его в виде цифр, ...

Я бы проверил инструмент переформатирования в таком редакторе, как NetBeans.

Когда вы переформатируете java, он корректно фиксирует длины строк как внутри, так и снаружи комментариев, если бы к Python применялся один и тот же алгоритм, он работал бы.

Для Java это позволяет вам установить любую ширину переноса и множество других параметров. Я был бы очень удивлен, если бы его не было ни в нативном, ни в виде плагина.

Не могу сказать точно только из описания, но стоит попробовать:

http://www.netbeans.org/features/python/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top