str.startswith()没有像我预期的那样工作

时间:2009-05-30 06:27:39

标签: python string python-3.x

我不明白为什么这不起作用。我正在对传递给函数的字符串执行lstrip(),并尝试查看它是否以“”“开头。出于某种原因,它会被无限循环捕获

def find_comment(infile, line):

    line_t = line.lstrip()
    if not line_t.startswith('"""') and not line_t.startswith('#'):
        print (line, end = '')
        return line

    elif line.lstrip().startswith('"""'):
            while True:
                if line.rstrip().endswith('"""'):
                    line = infile.readline()
                    find_comment(infile, line)
                else:
                    line = infile.readline()
    else:
        line = infile.readline()
        find_comment(infile, line)

我的输出:

Enter the file name: test.txt
import re
def count_loc(infile):

以下是我正在阅读的文件的顶部以供参考:

    import re

    def count_loc(infile):
        """ Receives a file and then returns the amount
            of actual lines of code by not counting commented
            or blank lines """

        loc = 0
        func_records = {}
        for line in infile:
        (...)

5 个答案:

答案 0 :(得分:4)

您没有提供和退出递归循环的路径。返回语句应该可以解决问题。

    (...)
    while True:
        if line.rstrip().endswith('"""'):
            line = infile.readline()
            return find_comment(infile, line)
        else:
            line = infile.readline()

答案 1 :(得分:2)

while True是一个无限循环。一旦完成,您需要break

答案 2 :(得分:1)

not line_t.startswith('"""') or not line_t.startswith('#')

无论字符串line_t表示什么,此表达式的计算结果为True。你想要'和'代替'或'吗?你的问题我不清楚。

答案 3 :(得分:1)

if not line_t.startswith('"""') or not line_t.startswith('#'):

始终会满足此if - 该行不以"""开头,或者不以#(或两者)开头。您可能打算在使用and的地方使用or

答案 4 :(得分:1)

只要行以注释开头或结尾,下面的代码就可以了。

但是,请记住,文档字符串可以在一行代码的中间开始或结束。

此外,您需要编写三重单引号以及分配给不是真正注释的变量的文档字符串的代码。

这会让你更接近答案吗?

def count_loc(infile):
  skipping_comments = False
  loc = 0 
  for line in infile:
    # Skip one-liners
    if line.strip().startswith("#"): continue
    # Toggle multi-line comment finder: on and off
    if line.strip().startswith('"""'):
      skipping_comments = not skipping_comments
    if line.strip().endswith('"""'):
      skipping_comments = not skipping_comments
      continue
    if skipping_comments: continue
    print line,