2012-01-31 11 views
17

Chcę zliczyć wiersze kodu w wieloplikowym projekcie Pythona tak dokładnie, jak to możliwe, ale bez uwzględniania komentarzy, docstrukcji lub pustych wierszy w sumie.Jak liczyć wiersze kodu w Pythonie z wyjątkiem komentarzy i poleceń?

Najpierw próbowałem użyć cloc, który jest dostępny jako pakiet Debiana. Ale cloc traktuje większość docstrukcji jako kod - mimo że są komentarzami. (Aktualizacja:. już nie - najnowsze wersje cloc teraz traktują docstrings Python jako komentarze)

Zauważyłem kilka uwag poniżej mówiąc, że docstrings powinny być uwzględnione w całości, ponieważ mogą one być wykorzystywane przez kod, aby wpływać na zachowanie się runtime i dlatego liczą się jako część programów code/data/config. Znaczącym tego przykładem jest "ply", który prosi o pisanie funkcji za pomocą docstrukcji, które, jak pamiętam, zawierają gramatykę i wyrażenia regularne, które są kluczowe dla działania programu. Jednak wydaje mi się to bardzo rzadkim wyjątkiem. W większości przypadków docstrukcje zachowują się jak komentarze. W szczególności wiem, że to prawda dla całego kodu, który chcę zmierzyć. Dlatego chcę je wykluczyć jako takie z mojej liczby linii.

+19

Powiedziałbym licząc komentarzy _is prawej way_, bo w ogólnych __the komentarze są tak samo cenne, jak rzeczywisty kod lines__ – Kimvais

+3

@Kimvais muszę powiedzieć, że miałem doświadczenie w przeciwną 20 lat programowania - komentarze są generalnie bezwartościowe, ponieważ kompilator nigdy ich nie sprawdza :-) –

+7

Python docstrings * are * code - stają się atrybutem funkcji "__doc__" i mogą zawierać testy. Być może musisz zdefiniować, co masz na myśli przez "linie kodu" – Hamish

Odpowiedz

6

Prawdopodobnie prawidłowe jest dołączanie doctrings Pythona do liczby wierszy kodu. Normalnie komentarz zostanie odrzucona przez kompilator, ale docstrings są przetwarzane:

Zobacz PEP 257 - Docstring Conventions:

docstring jest ciągiem dosłowny, który występuje jako pierwsze pismo w moduł, funkcji, klasy lub definicja metody. Taki docstring staje się specjalnym atrybutem tego obiektu.

...

literały łańcuchowe występujące gdzie indziej w kodzie Pythona może również działać jako dokumentacji. nie są one rozpoznawane przez kompilator Pythona kodu bajtowego i nie są dostępne jako atrybuty obiektu Runtime ..

Innymi słowy, docstrings skompilowane i stanowią, w bardzo realny sposób, kod program. Dodatkowo są one powszechnie używane przez doctest module do testowania jednostkowego, jako ciągi użycia dla narzędzi wiersza poleceń i tak dalej.

+3

Nie zgadzam się. Podczas gdy docstrukcje są kompilowane i mogą być używane przez kod, ich użycie i semantyczne są jako komentarze. Powinny być wyłączone z jakiejkolwiek znaczącej liczby linii. –

+3

@ JonathanHartley osobiście Myślę, że "skompilowany i może być użyty przez kod" jest dobrym argumentem * dla * jest liczony. – Hamish

+0

Hej. Myślę, że czuję coś przeciwnego, ponieważ nawet jeśli mogą być użyte przez kod, prawie nigdy nie są. Mam na myśli, że tak, są one używane przez "pydoc" i inne, ale uważam, że jedyny program, jaki widziałem, przechowujący dane w docstrukcjach, a następnie analizujący te dane, to "Ply" Davida Beazleya. Jest to bardzo rzadkie. Jeśli porównujesz dwa moduły, aby zobaczyć, który zawiera więcej kodu, a jeden ma docstrukcje, ale drugi nie, wydaje mi się najbardziej przydatnym, aby wykluczyć polecenia i uzyskać wynik "są one prawie takie same". –

2

Czy spojrzał na http://www.ohloh.net/p/ohcount - zawsze była całkiem na pieniądze dla mnie - choć nie używam Python

+2

Dzięki, ale jak cloc to narzędzie liczy również docstrings z potrójnymi apostrofami jako kodem, więc nie jest to tak naprawdę Python -świadomy. – ifischer

6

komentarz linie mogą być linie kodu w Pythonie. Zobacz na przykład doctest.

Ponadto, będziesz mieć problemy, aby znaleźć sensowną/niezawodny sposób, aby rozważyć takim wypadku jako komentarz lub kod:

foo = ('spam', 
     '''eggs 
      eggs 
      eggs''' 
     '''more spam''', 
     'spam') 

Wystarczy policzyć linie komentarz jako dobrze, myślę, że większość programistów będzie zgadzam się, że jest to dobry środek dla tego, co faktycznie próbujesz zmierzyć.

+2

Nie zgadzam się. Podczas gdy technogramy są kompilowane i dostępne z kodu, ogromna przewaga ich użycia i semantyczności jest komentarzem. Powinny być wyłączone z liczenia linii. Sposób wykrywania niejednoznacznie wyglądających przypadków, takich jak ten w tej odpowiedzi, polega na wykonaniu liczby linii przy użyciu AST. –

4

Tahar nie liczy docstrukcji.Oto jego funkcja count_loc:

def count_loc(lines): 
    nb_lines = 0 
    docstring = False 
    for line in lines: 
     line = line.strip() 

     if line == "" \ 
      or line.startswith("#") \ 
      or docstring and not (line.startswith('"""') or line.startswith("'''"))\ 
      or (line.startswith("'''") and line.endswith("'''") and len(line) >3) \ 
      or (line.startswith('"""') and line.endswith('"""') and len(line) >3) : 
      continue 

     # this is either a starting or ending docstring 
     elif line.startswith('"""') or line.startswith("'''"): 
      docstring = not docstring 
      continue 

     else: 
      nb_lines += 1 

    return nb_lines 
+6

Dziękuję za rozsądne zalecenia i za nieudzielanie niedorzecznych i pouczających oświadczeń, takich jak twoi koledzy, o tym, że docstruje się kod. Wiersz kodu _jest_ jest poprawną (i w rzeczywistości najlepszą: http://herraiz.org/blog/2010/11/22/making-software-is-out/) miarą złożoności kodu i kiedy potrzebuję tej złożoności do odzwierciedlenia surowego kodu źródłowego (zamiast mojej dużej ilości _math_ notes in docstrings), muszę pominąć docstrukcje! –

+3

Uważam, że dokument w docstrings jest dla dokumentacji – ychaouche

+0

Powyższy kod nie powiedzie się na docstrings, które używają pojedynczych cudzysłowów lub na niektórych regularnych ciągach, które używają potrójnych cytatów. Właściwym sposobem rozwiązania tego problemu jest spojrzenie na AST. –

Powiązane problemy