用于打印输出的明智的 python 源代码行换行
Posted
技术标签:
【中文标题】用于打印输出的明智的 python 源代码行换行【英文标题】:Sensible python source line wrapping for printout 【发布时间】:2009-06-23 23:07:54 【问题描述】:我正在编写一个需要排版大量 python 源代码的乳胶文档。我正在使用pygments(python 模块,而不是在线演示)将这个 python 封装在乳胶中,除了长的单独行的情况下效果很好 - 它只是继续离开页面。我可以手动包装这些行,只是这对我来说似乎不是一个优雅的解决方案,而且我更喜欢花时间思考疯狂的自动化解决方案而不是重复性任务。
我想要的是某种处理 python 源代码的方法,以将行包装到某个最大字符长度,同时保留功能。我玩过一些python,最接近的是在最大行长度之前的最后一个空格中插入\\\n
- 但是当然,如果这最终出现在字符串和cmets中,事情就会出错。坦率地说,我不确定如何解决这个问题。
那么,有没有人知道可以处理源代码的模块或工具,这样任何行都不会超过特定长度 - 或者至少是开始编写类似代码的好方法?
【问题讨论】:
【参考方案1】:您可能希望稍微扩展您当前的方法,但使用标准库中的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 ''
【讨论】:
现在看起来很有希望,我将研究 tokenize 模块。谢谢! 我想这是要走的路。当我有机会回复它时,将发布代码作为另一个答案。【参考方案2】:我使用LaTeX中的listings
包插入源代码;它确实语法高亮,换行符等。
在序言中加入以下内容:
\usepackagelistings
%\lstloadlanguagesPython # 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】:我会在像 NetBeans 这样的编辑器中检查重新格式化工具。
当您重新格式化 java 时,它会正确修复 cmets 内部和外部的行长度,如果将相同的算法应用于 Python,它将起作用。
对于 Java,它允许您设置任何换行宽度和一堆其他参数。如果它不存在本地或插件,我会感到非常惊讶。
仅从描述中无法确定,但值得一试:
http://www.netbeans.org/features/python/
【讨论】:
重新格式化 java 可能比在 Python 中更容易一些。谁能确认 Netbeans(或任何其他编辑器)是否能够正确执行此操作? 在 Vim 中一个不太智能但类似的解决方案是直观地选择要“重新列”的数据并按gw
以允许列的最大宽度为当前设置的 textwidth
到。但是这个 Vim 技巧在纯文本上确实比在源代码上效果更好。以上是关于用于打印输出的明智的 python 源代码行换行的主要内容,如果未能解决你的问题,请参考以下文章