Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

if-pythonのglobals()にもっと気を使わなくていいの?という話

$
0
0

問題

こんな感じで、vimscriptの中にpythonのコード書けるじゃないですか。

python3<< EOS
defcheck(path):
  print(path) # 何らかのチェックをしてると思ってくださいな
EOS

function! CheckSomething()python3<< EOS
import vimpath=vim.eval('expand("%")')check(path)
EOS
endfunction

で、こう書いた場合、 check()はグローバルに定義される訳ですよね。
ついでに pathも、見た目上は CheckSomething()内の変数ですがPythonの世界ではグローバルです。
なので、まったく別のプラグインのコードのどこかにpythonのコードが埋め込まれていて、そこで checkという名前の関数なり変数なりが定義されていたら、それを読み込んだ時点で上の CheckSomething()は動かなくなってしまいます。

対応

グローバルでの名前の衝突を避けるために考えられる方法としてぱっと思いつくのはこんなとこでしょうか。

プレフィックスをつける

python3<< EOS
  def hogeplugin_check():
    """以下略"""
  EOS

クラスに包む

python3<< EOS
class PyHogePlugin:
  @classmethod
  defcheck(cls):
    """以下略"""
EOS

別のファイルにcheck()を定義してモジュールとして読み込む

python3<< EOS
import sys
sys.path.append(...) # 参照パスを適当に追加
import pyhogeplugin  # pyhogeplugin.check()として呼ぶ
EOS

実際のところは?

と、上記のようなことをした方がいいんじゃないかと僕は思うのですが、有名どころのプラグインのコードを見てもその辺無頓着なのが多い気がします。
僕が考えすぎなのか、何か勘違いしているのか、やっぱり気をつけるべきなのか、よく分からないのでVimmerの人々に聞いてみたいところです。

※ python以外のif-XXXでも同じような話はあると思います


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>