PyFlakes.vim で遭遇したエラー

2012/02/02 追記
Pull request したのがいつの間にか本体に取り込まれていた。
なので最新を git clone したら発生しないはず。


PyFlakes.vim で以下の条件の時にエラーが発生した。

  1. MacVim.app を起動する
  2. set filetype=pythonPython なファイルにする
  3. 適当にエラーが出るようなものを書く
aaa = bbb

こんな感じでやると以下のようなエラーがでる

function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
Traceback (most recent call last):
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "<string>", line 1, in <module>
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "<string>", line 82, in check
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/Users/xxx/.vim/bundle/pyflakes-vim/ftplugin/python/pyflakes/pyflakes/checker.py", li
ne 195, in __init__
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    self.handleChildren(tree)
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/Users/xxx/.vim/bundle/pyflakes-vim/ftplugin/python/pyflakes/pyflakes/checker.py", li
ne 287, in handleChildren
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    self.handleNode(node, tree)
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/Users/xxx/.vim/bundle/pyflakes-vim/ftplugin/python/pyflakes/pyflakes/checker.py", li
ne 309, in handleNode
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    handler(node)
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/Users/xxx/.vim/bundle/pyflakes-vim/ftplugin/python/pyflakes/pyflakes/checker.py", li
ne 589, in ASSIGN
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    self.handleNode(node.value, node)
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/Users/xxx/.vim/bundle/pyflakes-vim/ftplugin/python/pyflakes/pyflakes/checker.py", li
ne 309, in handleNode
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    handler(node)
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/Users/xxx/.vim/bundle/pyflakes-vim/ftplugin/python/pyflakes/pyflakes/checker.py", li
ne 461, in NAME
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    if (os.path.basename(self.filename) == '__init__.py' and
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/posixpath.py", line 1
11, in basename
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
    i = p.rfind('/') + 1
function <SNR>146_RunPyflakes の処理中にエラーが検出されました:
行   45:
AttributeError: 'NoneType' object has no attribute 'rfind'

なんで起きたかというと、pyflakes.vim でチェック時にバッファ名を取得していて、それを PyFlakes のチェックメソッドに渡している。

def check(buffer):
    filename = buffer.name
    contents = buffer[:]

# -- snip --
    else:
        # pyflakes looks to _MAGIC_GLOBALS in checker.py to see which
        # UndefinedNames to ignore
        old_globals = getattr(checker,' _MAGIC_GLOBALS', [])
        checker._MAGIC_GLOBALS = set(old_globals) | builtins

        w = checker.Checker(tree, filename)

この filename が None の場合(バッファ名が設定してない)に上記のようなエラーが起きる。
checker.Checker のコンストラクタの filename はデフォルト引数として '(none)' を期待しているっぽい。


とりあえず、以下のようにすればエラーにならない。

filename = '(none)' if filename is None else filename
w = checker.Checker(tree, filename)

多分あまり遭遇しないケースな気がする。