【发布时间】:2010-12-18 16:00:01
【问题描述】:
是否有可以从 Python 源代码中删除 cmets 和 docstrings 的 Python 脚本或工具?
它应该处理以下情况:
"""
aas
"""
def f():
m = {
u'x':
u'y'
} # faake docstring ;)
if 1:
'string' >> m
if 2:
'string' , m
if 3:
'string' > m
所以最后我想出了一个简单的脚本,它使用标记化模块并删除评论标记。它似乎工作得很好,除了我无法在所有情况下删除文档字符串。看看你是否可以改进它以删除文档字符串。
import cStringIO
import tokenize
def remove_comments(src):
"""
This reads tokens using tokenize.generate_tokens and recombines them
using tokenize.untokenize, and skipping comment/docstring tokens in between
"""
f = cStringIO.StringIO(src)
class SkipException(Exception): pass
processed_tokens = []
last_token = None
# go thru all the tokens and try to skip comments and docstrings
for tok in tokenize.generate_tokens(f.readline):
t_type, t_string, t_srow_scol, t_erow_ecol, t_line = tok
try:
if t_type == tokenize.COMMENT:
raise SkipException()
elif t_type == tokenize.STRING:
if last_token is None or last_token[0] in [tokenize.INDENT]:
# FIXEME: this may remove valid strings too?
#raise SkipException()
pass
except SkipException:
pass
else:
processed_tokens.append(tok)
last_token = tok
return tokenize.untokenize(processed_tokens)
我还想在具有良好单元测试覆盖率的大量脚本上对其进行测试。你能推荐这样一个开源项目吗?
【问题讨论】:
-
@mavnn :),不要问,我们需要保护我们的代码不被窥探 LOL
-
-1:-OO 选项从字节码中删除 cmets。为什么要乱搞其他东西?通过删除文档字符串(可能包含有用的单元测试)来混淆代码是没有意义的。
-
@S.Lott -OO 将编译后的代码冻结为不同的 python 版本。我同意你的观点,这不是通常有用的任务,但在极少数情况下需要它。这对我来说也是一个很好的玩具任务,所以+1。
-
一个用例可能是计算代码行数。
cloc包含文档字符串 - 如果没有,我会更喜欢。