当前位置: 首页 > 面试题库 >

删除Python注释/文档字符串的脚本

翟聪
2023-03-14
问题内容

是否有可用的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从返回一个迭代器,因此应包装在对的调用中