2016-08-03 9 views
0

Python 2.7でコードを書いています。 Python 3.xと互換性があります。これまでのところ、私はfuturizemodernizeのpythonパッケージと2to3を試してみました。.next()は、Python 2と3の両方と互換性があります。

しかし、私はpython 2.7の.next()メソッドに固執しています。そして、私は次のように、両方のfuturize2to3パッケージに警告を受ける:

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

そして、私はPythonの3.xの中で実際のコードを実行すると、それは私にこの警告を与える:

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

のpython内の関連するコード2.7は次のとおりです。

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 

答えて

2

.next()メソッドを直接呼び出さないでください。代わりにイテレータにnext()functionを使用します。

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

next()機能は、Python 2と3

の両方で正しいフックを呼び出しますしかし、あなたがfuturizeから表示されるエラーメッセージは、あなたがも可能性があることを示しあなたのコードの他の場所にあるnextという名前に縛られています。あなたのようなものがある場合は

は:グローバルとして

next = some_expression 

または

def next(...): 
    # some function 

を、あなたは組み込みのnext()機能をシャドーイングあります。問題を回避するために、他の用途をnextという名前でグローバルに変更してください。ツールは、関数としてnext()の使用を避けるために、代わりにg.next()g.__next__()を使用する方法

$ 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 

注:

はたとえば、次のデモコードは、あなたが見るメッセージをスローします。

にそのコードの結果からnext機能を削除する:

$ 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、おかげで、ITSは今働いて! – user3698773

関連する問題