str.startswith () не работает, как я хотел - PullRequest
0 голосов
/ 30 мая 2009

Не понимаю, почему это не сработает. Я выполняю 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 ]

4 голосов
/ 30 мая 2009

Вы не указали путь выхода из рекурсивного цикла. Оператор возврата должен помочь.

    (...)
    while True:
        if line.rstrip().endswith('"""'):
            line = infile.readline()
            return find_comment(infile, line)
        else:
            line = infile.readline()
2 голосов
/ 30 мая 2009

while True - бесконечный цикл. Вам нужно break как только вы закончите.

1 голос
/ 30 мая 2009

Пока строки начинаются или заканчиваются комментарием, приведенный ниже код должен работать.

Однако имейте в виду, что строки документов могут начинаться или заканчиваться в середине строки кода.

Кроме того, вам нужно будет написать тройные одинарные кавычки, а также строки документов, присвоенные переменным, которые на самом деле не являются комментариями.

Получается ли это ближе к ответу?

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,
1 голос
/ 30 мая 2009
if not line_t.startswith('"""') or not line_t.startswith('#'):

Это if всегда будет выполнено - либо строка не начинается с """, либо не начинается с # (или и то, и другое). Вы, вероятно, хотели использовать and там, где использовали or.

1 голос
/ 30 мая 2009
not line_t.startswith('"""') or not line_t.startswith('#')

Это выражение имеет значение True независимо от того, что обозначает строка line_t. Вы хотите «и» вместо «или»? Ваш вопрос мне не понятен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...