2016-11-09 4 views
10

Czy istnieje jakiś sposób, aby uzyskać błąd lint na pominiętych przecinkach w literalnej liście ciągów?Czy można uzyskać błąd lint na niejawny ciąg dołączanie w python?

Przykład:

exceptions = ["banana", "pineapple", "apple" 
       "pen"] 

Możesz myśleć, lista ta zawiera 4 elementy, ale prawdę mówiąc! "jabłko" i "pióro" są połączone w "applepen".

Jestem przerażony tymi pominiętymi przecinkami. Czy jest jakieś narzędzie, które pomaga mi je znaleźć?

Przykład 2:

exceptions = ["Carmichael", 
       "Vanessa"  # <--- Spot the missing comma 
       "Ford"] 
+0

To samo dotyczy '' foo '"bar" ', który jest' "foobar" '. Czy to błąd? Czemu? –

+0

Hmm tak, myślę, że chciałbym również błędu lint dla tej sprawy, jak również. Tworzy więcej kłopotów niż to, co jest warte. Zobacz także http://legacy.python.org/dev/peps/pep-3126/#concerns – Moberg

+2

Nie wiem, czy istnieje jakieś narzędzie do tego? Nawet jeśli tak, dlaczego tego potrzebujesz? Jest to zachowanie Pythona i powinieneś o tym pamiętać. Zawsze będzie * Co "IF" *? Co jeśli napisałem 2 zamiast 3? Czy potrzebujesz narzędzia, które ci to powie? Obawa, o której wspomniałeś w pytaniu, jest taka sama. –

Odpowiedz

-1

SublimeText3 z wtyczki flake8, czyli owinięcie wokół innymi modułami pyton przez włókna, to można naprawić.

Else, można zrobić skrypt, który liczyć ((liczba „)/2) -1 i przecinków w linii, a jeśli wynik nie mecz, dodać śpiączkę

EDIT:.

Explanaition co mówię.

def countQuotes(string): 
     return string.count('"') 
    def countCommas(string): 
     return string.count(',') 
    files = os.listdir('your/directory') 
    for filename in files: 
    if filename.endswith(".py"): 
     with fileinput.FileInput("your/directory"+"/"+filename, inplace=True, backup='.bak') as fileContent: 
     for line in fileContent: 
      if '"' in line: 
       numQuotes = countQuotes(line) 
       numCommas = countCommas(line) 
       if(numQuotes == 2 and ']' in line): 
        if(numCommas != 0): 
         #error, must delete a comma in right place and print line 
        else: 
         print(line) 
       if(numQuotes == 2 and ']' not in line): 
        if(numCommas != 1): 
         #error, must add a comma in right place and print line 
        else: 
         print(line) 
       if(numQuotes > 2): 
        if(numCommas > (numQuotes//2)-1) 
         #error, must delete a comma in right place and print line 
        elif(numCommas < (numQuotes//2)-1) 
         #error, must add a comma in right place and print line 
        else: 
         print(line) 
      else: 
       print(line) 

metoda ta musi pracować, pomyśl, gdzie trzeba wstawić lub usunąć przecinek na końcu mieć format chcesz

+0

Takie proste zliczanie nie działa. Porównaj pytanie w przykładzie i '[" samochód "," rower "]' – Moberg

+0

Niestety nie używasz wzniosłej pracy. Być może powinienem. – Moberg

+0

@moberg myślę, że nadal działa w twoim przypadku, 4 ", 1 przecinek –

0

nie jestem pewien, jaki rodzaj s nasze narzędzie do analizy, którego używasz, więc mogę tylko zaproponować sugestię. Byłoby jednak zbyt długo na komentarz, więc napisałem scenariusz proof-of-concept.

Chodzi o to, aby przyjrzeć się kodem źródłowym za pomocą modułu Pythona tokenize, który generuje tokeny z wyrażeń Pythona. Jeśli dobrze napisany kod Pythona zawiera niejawnie kontynuowane ciągi literałów, pojawi się jako token STRING, a następnie NL.

Na przykład użyjmy pliku źródłowego source.py jako przypadku testowego.

x = ("a" 
     "b" # some trailing spaces 
# Coment line 
"c" 
"" 
    # The following is an explicit continuation 
    "d" \ 
    "e") 

Uruchomienie polecenia python check.py < source.py plik generuje:

1:8: implicit continuation: 
x = ("a" 

    ~~~^ 
2:35: implicit continuation: 
     "b" # some trailing spaces 

           ~~~^ 
4:3: implicit continuation: 
"c" 

~~~^ 
5:2: implicit continuation: 
"" 

^

Program, check.py, jest tylko proof-of-concept i nie sprawdzić błędy składniowe lub inne przypadki krawędzi:

import sys 
import tokenize 


LOOKNEXT = False 
tok_gen = tokenize.generate_tokens(sys.stdin.readline) 
for tok, tok_str, start, end, line_text in tok_gen: 
    if tok == tokenize.STRING: 
     LOOKNEXT = True 
     continue 
    if LOOKNEXT and (tok == tokenize.NL): 
      warn_header = "%d:%d: implicit continuation: " % start 
      print >> sys.stderr, warn_header 
      print >> sys.stderr, line_text 
      indents = start[1] - 3 
      if indents >= 0: 
       print >> sys.stderr, "%s~~~^" % (" " * indents) 
      else: 
       print >> sys.stderr, "%s^" % (" " * start[1]) 
    LOOKNEXT = False 

Mam nadzieję, że pomysł może pomóc w rozszerzeniu narzędzia lub IDE ID do użycia.

Powiązane problemy