2009-05-30 13 views
-1

なぜこれが機能しないのかわかりません。私は、関数に渡された文字列にlstrip()を実行し、それが何らかの理由で、それは無限ループstr.startswith()が意図したとおりに動作しない

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: 
     (...) 
+2

重複して再投稿:http://stackoverflow.com/questions/927584/str-startswith-not-working-as-i-intendedを –

答えて

4

再帰的ループのパスを指定して終了していません。 returnステートメントはそのトリックを行うべきです。

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

O男、私はそれを忘れて信じられない。何らかの理由で、私は関数を再度呼び出すとループが壊れると思っていました。どうもありがとう! – Justen

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

この式がTrueと評価されていません文字列line_tが何を意味するか。あなたは 'か'の代わりに 'と'を使いますか?あなたの質問は私には分かりません。いずれかの行が"""に起動しない、またはそれは#(あるいはその両方)で始まらない -

+0

woopsは、ええ、私はそれを変更しましたが、それは無限で立ち往生上記のwhileステートメントでループします。私は元の投稿を更新してこれを反映させました – Justen

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

このifは常に満足されます。 orを使用した場合、おそらくandを使うつもりです。

+0

ええ、そうですが、今は無限のwhileループにこだわっています。しかし、私はなぜ、ソースからの任意の洞察を与えられたのか分からない?私は元の投稿を更新しました。これは – Justen

+0

を反映しているかもしれません。あなたのwhileループが "while true"と言ってあなたが壊れていないかもしれないからかもしれません。ちょうど野生の推測... –

2

while Trueは無限ループです。完了したらbreakする必要があります。

1

コメントの開始または終了が間違いない限り、以下のコードが有効です。

ただし、ドキュメントストリングはコード行の途中で開始または終了できます。

また、実際のコメントではない変数に割り当てられたdocstringだけでなく、三重引用符もコーディングする必要があります。

これで答えが得られますか?

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

ああ、私は三重引用符を忘れていました。このプロジェクトは実際には私のC++クラス用ですが、私は同時に自分自身でPythonを教えようとしていて、プロジェクトに2回決めました。コードをありがとう、私が必要なのは、whileループからのreturn文です。 – Justen

関連する問題