Разумное завершение строки исходного кода Python для распечатки - PullRequest
2 голосов
/ 24 июня 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

Возможно, вы захотите немного расширить свой текущий подход, но с помощью модуля tokenize из стандартной библиотеки, чтобы определить, где поместить разрывы строк. Таким образом, вы можете видеть фактические токены (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   ''
2 голосов
/ 27 июля 2009

Я использую пакет listings в 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
}

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

1 голос
/ 24 июня 2009

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

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

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

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

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

...