2016-08-03 12 views
0

Ich habe Code in Python 2.7 geschrieben, dass ich es kompatibel machen wollen mit Python 3.x. Bisher habe ich versucht, die futurize und modernize Python-Pakete sowie 2to3, und alles scheint in Ordnung.Making .next() kompatibel mit beiden Python 2 und 3

Aber ich bin mit Python 2.7 .next() Methode stecken. Und ich bekomme Warnung sowohl mit den futurize und 2to3 Paketen, wie:

RefactoringTool: Line 34: Calls to builtin next() possibly shadowed by global binding 

Und wenn ich tatsächlich Code in Python 3.x es gibt mir diese Warnung:

AttributeError: 'itertools._grouper' object has no attribute 'next' 

den entsprechenden Code in Python 2.7 ist wie folgt:

with open('file.txt', 'rU') as f: 
    l = f.readlines()[2:] 
    up = (x[1] for x in groupby(l, lambda line: line[0] == ">")) 
    for u in up: 
     head = u.next()[1:].strip() 
     q = "".join(s.strip() for s in u.next()) 
     # do something 

Antwort

2

Sie das .next() Methode nicht direkt aufrufen. Verwenden Sie die next()function auf einem Iterator statt:

for u in up: 
    head = next(u)[1:].strip() 
    q = "".join(s.strip() for s in next(u)) 

Die next() Funktion wird die richtige Haken auf beiden Python 2 und 3.

jedoch aufrufen, wird die Fehlermeldung, die Sie von futurize sehen gibt an, dass Sie kann auch haben den Namen next an anderer Stelle in Ihrem Code gebunden.

Wenn Sie etwas haben, wie:

next = some_expression 

oder

def next(...): 
    # some function 

als globaler, dann sind Sie die eingebaute in next() Funktion Shadowing. Benennen Sie jede andere Verwendung von next als global in diesem Modul um, um Probleme zu vermeiden.

Zum Beispiel die folgende Demo-Code wirft die Nachricht Sie sehen:

$ cat demo.py 
def next(): pass 
n = g.next() 
$ bin/futurize demo.py 
RefactoringTool: Skipping optional fixer: idioms 
RefactoringTool: Skipping optional fixer: ws_comma 
RefactoringTool: Refactored demo.py 
--- demo.py (original) 
+++ demo.py (refactored) 
@@ -1,2 +1,2 @@ 
def next(): pass 
-n = g.next() 
+n = g.__next__() 
RefactoringTool: Files that need to be modified: 
RefactoringTool: demo.py 
RefactoringTool: Warnings/messages while refactoring: 
RefactoringTool: ### In file demo.py ### 
RefactoringTool: Line 1: Calls to builtin next() possibly shadowed by global binding 
RefactoringTool: ### In file demo.py ### 
RefactoringTool: Line 1: Calls to builtin next() possibly shadowed by global binding 

Beachten Sie, wie das Werkzeug verwendet dann g.__next__() statt g.next(), mit next() als Funktion zu vermeiden.

die next Funktion aus diesem Code führt Entfernen:

$ cat demo.py 
# def next(): pass 
n = g.next() 
$ bin/futurize demo.py 
RefactoringTool: Skipping optional fixer: idioms 
RefactoringTool: Skipping optional fixer: ws_comma 
RefactoringTool: Refactored demo.py 
--- demo.py (original) 
+++ demo.py (refactored) 
@@ -1,2 +1,2 @@ 
# def next(): pass 
-n = g.next() 
+n = next(g) 
RefactoringTool: Files that need to be modified: 
RefactoringTool: demo.py 
+0

@Martijn, Vielen Dank, Ihre Arbeit jetzt! – user3698773