[Vim] if_python のおかしな挙動

if_python を使っていたらおかしな挙動ではまったのでメモ。
if_python では vim.eval 関数を使えます。 vim.eval は引数に Vim script の式を取って、それを評価した結果を python の値として取得できます。
以下のコードでは、 Vim script の matchstr('', 'a') を評価した結果を表示します。
これを実行した結果として、空文字列('')が表示されることを期待しましたが、 None と表示されました。Vim のバグ?

python import vim
python print repr(vim.eval("matchstr('', 'a')"))
" Noneと表示される

普通に Vim script として評価した場合は期待通りの結果となります。 if_pythonvim.eval したときだけなぜか None となってしまいます。

echo matchstr('', 'a')
" 結果は空文字列となる
echo type(matchstr('', 'a')) == type('')
" 型は文字列型となっている

ちなみに、 matchstr が空文字列以外を返す場合は期待通りの動作となります。

python import vim
python print repr(vim.eval("matchstr('a', 'a')"))
" 'a'と表示される

let g:str = ''
python print repr(vim.eval("g:str"))
" ''と表示される

let g:str = matchstr('a', 'a')
python print repr(vim.eval("g:str"))
" Noneと表示される。一時変数に入れてもやっぱりだめ

回避策

とりあえず、 matchstr の結果に空文字列を結合することで期待通りの動作になりました。

python import vim
python print repr(vim.eval("matchstr('', 'a') . ''"))
" ''と表示される。期待通り