是否有可用的Python脚本或工具可以从Python源代码中删除注释和文档字符串?
应该注意以下情况:
"""
aas
"""
def f():
m = {
u'x':
u'y'
} # faake docstring ;)
if 1:
'string' >> m
if 2:
'string' , m
if 3:
'string' > m
因此,最后我提出了一个简单的脚本,该脚本使用了tokenize模块并删除了注释令牌。它似乎工作得很好,除了我无法在所有情况下都删除文档字符串。看看是否可以改进它以删除文档字符串。
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)
我也想在具有良好单元测试覆盖率的大量脚本中对其进行测试。您可以建议这样一个开源项目吗?
这可以做到:
""" Strip comments and docstrings from a file.
"""
import sys, token, tokenize
def do_file(fname):
""" Run on just one file.
"""
source = open(fname)
mod = open(fname + ",strip", "w")
prev_toktype = token.INDENT
first_line = None
last_lineno = -1
last_col = 0
tokgen = tokenize.generate_tokens(source.readline)
for toktype, ttext, (slineno, scol), (elineno, ecol), ltext in tokgen:
if 0: # Change to if 1 to see the tokens fly by.
print("%10s %-14s %-20r %r" % (
tokenize.tok_name.get(toktype, toktype),
"%d.%d-%d.%d" % (slineno, scol, elineno, ecol),
ttext, ltext
))
if slineno > last_lineno:
last_col = 0
if scol > last_col:
mod.write(" " * (scol - last_col))
if toktype == token.STRING and prev_toktype == token.INDENT:
# Docstring
mod.write("#--")
elif toktype == tokenize.COMMENT:
# Comment
mod.write("##\n")
else:
mod.write(ttext)
prev_toktype = toktype
last_col = ecol
last_lineno = elineno
if __name__ == '__main__':
do_file(sys.argv[1])
我将存根注释替换为文档字符串和注释,因为它简化了代码。如果完全删除它们,则还必须在它们之前消除缩进。
问题内容: 我想做一个获取字符串的函数,以防它有内联注释时将其删除。我知道这听起来很简单,但是我想确保即时消息正确执行,例如: 我考虑了两种方法:否则请随时咨询 迭代字符串并找到双行括号并使用substring方法。 正则表达式的方式..(我不太确定回合吧) 您能告诉我什么是最好的方法,并告诉我应该怎么做吗?(请不要建议太高级的解决方案) 编辑:可以使用Scanner对象以某种方式完成此操作吗?(
问题内容: 有谁知道(或处理)在构建时如何从Java类文件中删除注释?当我使用Ant构建项目时,我想对项目中的特定软件包执行此操作。最欢迎使用任何ANT脚本或一些自定义代码。 问题答案: 编译文件中没有注释。
问题内容: 有谁知道(或处理)在构建时如何从Java类文件中删除注释?当我使用Ant构建项目时,我想对项目中的特定软件包执行此操作。最欢迎使用任何ANT脚本或一些自定义代码。 问题答案: 编译文件中没有注释。
问题内容: 我是python编程的新手,我有点困惑。我尝试从字符串中获取字节以进行哈希和加密,但是我得到了 字符串前面的b字符,如以下示例所示。有什么办法可以避免这种情况吗?有人可以提供解决方案吗?对不起这个愚蠢的问题 输出: 问题答案: 解码是多余的 首先,您对这种情况有误解,这是因为对所发生的事情有误解。 您会得到,因为您已对其进行编码,现在它是一个字节对象。 修正: 您可以先打印字符串 编码
问题内容: 我已经从论坛中提取了一些信息。这是我现在拥有的原始字符串: 我不喜欢的是子字符串和。我确实想保留字符串的其他部分,除此之外。所以结果应该是这样的 我该怎么办?实际上,我使用漂亮的汤从论坛中提取了上面的字符串。现在,我可能更喜欢使用正则表达式删除该部分。 问题答案: 该函数采用常规表达式,并将字符串中的所有匹配项替换为第二个参数。在这种情况下,我们正在搜索所有标签(),然后将其替换为()
问题内容: 我想从python中的字符串列表中删除所有空字符串。 我的想法如下: 有没有更多的Python方式可以做到这一点? 问题答案: 我会用: Python 3从返回一个迭代器,因此应包装在对的调用中