2

我正在编写一个需要排版大量 python 源代码的乳胶文档。我正在使用pygments(python 模块,而不是在线演示)将这个 python 封装在乳胶中,除了长的单独行的情况下效果很好 - 它只是继续离开页面。我可以手动包装这些行,除了这对我来说似乎不是一个优雅的解决方案,而且我更喜欢花时间对疯狂的自动化解决方案感到困惑,而不是重复性任务。

我想要的是某种处理 python 源代码的方法,以将行包装到某个最大字符长度,同时保留功能。我玩过一些python,最接近的是\\\n在最大行长之前插入最后一个空格-但是当然,如​​果这最终出现在字符串和注释中,事情就会出错。坦率地说,我不确定如何解决这个问题。

那么,是否有人知道可以处理源代码的模块或工具,这样任何行都不会超过一定的长度——或者至少是开始编写类似代码的好方法?

4

3 回答 3

3

您可能希望稍微扩展您当前的方法,但使用标准库中的tokenize模块来确定在哪里放置换行符。这样您就可以看到源代码的实际标记(COMMENT、STRING 等),而不仅仅是空格分隔的单词。

以下是 tokenize 可以做什么的简短示例:

>>> 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   ''
于 2009-06-24T00:15:28.877 回答
2

我使用listingsLaTeX 中的包插入源代码;它确实语法高亮,换行符等。

在序言中加入以下内容:

\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
}

该软件包具有内联代码的挂钩,包括整个文件,将其显示为数字,...

于 2009-07-27T14:47:04.010 回答
1

我会在像 NetBeans 这样的编辑器中检查重新格式化工具。

当您重新格式化 java 时,它会正确修复注释内部和外部的行长度,如果将相同的算法应用于 Python,它将起作用。

对于 Java,它允许您设置任何包装宽度和一堆其他参数。如果它不存在本地或插件,我会感到非常惊讶。

仅从描述中无法确定,但值得一试:

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

于 2009-06-23T23:15:58.467 回答