Разумное завершение строки исходного кода Python для распечатки
-
10-07-2019 - |
Вопрос
Я работаю над латексным документом, который потребует значительного набора исходного кода на 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 это позволяет вам установить любую ширину переноса и множество других параметров. Я был бы очень удивлен, если бы его не было ни в нативном, ни в виде плагина.
Не могу сказать точно только из описания, но стоит попробовать: