合理的Python源代码换行打印

2 投票
3 回答
1295 浏览
提问于 2025-04-15 12:27

我正在制作一个latex文档,需要排版大量的Python源代码。我使用的是pygments(这是一个Python模块,不是在线演示),这个工具在大多数情况下都很好用,但对于很长的行,它们会直接超出页面。我可以手动换行,但我觉得这样不太优雅,我更愿意花时间去思考一些疯狂的自动化解决方案,而不是做重复的工作。

我希望能有一种方法来处理Python源代码,把行数限制在一定的最大字符长度,同时又不影响代码的功能。我试过一些Python代码,最接近的做法是把\\\n插入到最大行长度前的最后一个空格处,但如果这个换行符出现在字符串或注释中,就会出问题。说实话,我不知道该怎么解决这个问题。

所以,有没有人知道有什么模块或工具可以处理源代码,使得没有行超过某个长度,或者至少有个好的方法可以开始编写这样的代码?

3 个回答

1

我建议你在像NetBeans这样的编辑器里找一个格式化工具。

当你对Java代码进行格式化时,它会正确调整代码行的长度,包括注释里的内容。如果用同样的方法去处理Python代码,应该也能有效果。

对于Java来说,它允许你设置任何换行的宽度,还有很多其他的参数。如果没有类似的功能,不管是自带的还是插件,我会感到很惊讶。

根据描述我不能确定,但值得一试:

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

2

我在LaTeX中使用listings这个包来插入源代码;它可以高亮语法、自动换行等等。

在你的文档开头部分加上以下内容:

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

这个包还可以处理行内代码,包括整个文件,并且可以把它们显示成图形等等……

3

你可能想稍微扩展一下你现在的方法,可以使用标准库中的 tokenize 模块来确定在哪里换行。这样你就能看到源代码中的实际标记(比如注释、字符串等),而不仅仅是用空格分开的单词。

下面是一个 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   ''

撰写回答