合理的Python源代码换行打印
我正在制作一个latex文档,需要排版大量的Python源代码。我使用的是pygments(这是一个Python模块,不是在线演示),这个工具在大多数情况下都很好用,但对于很长的行,它们会直接超出页面。我可以手动换行,但我觉得这样不太优雅,我更愿意花时间去思考一些疯狂的自动化解决方案,而不是做重复的工作。
我希望能有一种方法来处理Python源代码,把行数限制在一定的最大字符长度,同时又不影响代码的功能。我试过一些Python代码,最接近的做法是把\\\n
插入到最大行长度前的最后一个空格处,但如果这个换行符出现在字符串或注释中,就会出问题。说实话,我不知道该怎么解决这个问题。
所以,有没有人知道有什么模块或工具可以处理源代码,使得没有行超过某个长度,或者至少有个好的方法可以开始编写这样的代码?
3 个回答
1
我建议你在像NetBeans这样的编辑器里找一个格式化工具。
当你对Java代码进行格式化时,它会正确调整代码行的长度,包括注释里的内容。如果用同样的方法去处理Python代码,应该也能有效果。
对于Java来说,它允许你设置任何换行的宽度,还有很多其他的参数。如果没有类似的功能,不管是自带的还是插件,我会感到很惊讶。
根据描述我不能确定,但值得一试:
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 ''