2010年10月12日火曜日

pyflakes3k - Python 3対応の文法チェッカー

Python用の文法チェッカーにPyFlakesというツールがあるのですが、そのPython3対応版らしいpyflakes3kというツールを見つけたのでさっそく使用してみました。



色々なコードで試してみたところ、
#!/usr/bin/env python3.1
try:
   a = 1/0
except ZeroDivisionError as err:
   print(err)
のようなコードで、
$ pyflakes test_excepthandler.py 
test_excepthandler.py:5: undefined name 'err'
のような不要な警告が発生することが分かりました。
どうやら、Python 3で変更されたexcept節のasを使った記法を上手く扱えないようなのですが、これはかなり困ります。
そこで、てきとーに作成した下記のパッチを当ててみました。

diff -Naur pyflakes3k.orig/pyflakes/checker.py pyflakes3k/pyflakes/checker.py
--- pyflakes3k.orig/pyflakes/checker.py 2010-10-12 22:49:44.000000000 +0900
+++ pyflakes3k/pyflakes/checker.py 2010-10-12 22:56:51.000000000 +0900
@@ -102,6 +102,11 @@
 
 
 
+class ExceptHandler(Binding):
+    pass
+
+
+
 class ExportBinding(Binding):
     """
     A binding created by an C{__all__} assignment.  If the names in the list
@@ -339,7 +344,7 @@
     EQ = NOTEQ = LT = LTE = GT = GTE = IS = ISNOT = IN = NOTIN = ignore
 
     # additional node types
-    COMPREHENSION = EXCEPTHANDLER = KEYWORD = handleChildren
+    COMPREHENSION = KEYWORD = handleChildren
 
     def addBinding(self, lineno, value, reportRedef=True):
         '''Called when a binding is altered.
@@ -508,6 +513,11 @@
                 "Got impossible expression context: %r" % (node.ctx,))
 
 
+    def EXCEPTHANDLER(self, node):
+        self.addBinding(node.lineno, ExceptHandler(node.name, node), reportRedef=False)
+        for child_node in iter_child_nodes(node):
+            self.handleNode(child_node, node)
+
     def FUNCTIONDEF(self, node):
         # the decorators attribute is called decorator_list as of Python 2.6
         if hasattr(node, 'decorators'):

一応、直ったようには見えるのですが、もう少し様子を見てみます。

0 件のコメント:

コメントを投稿