[英]Python, VIM: namespace, scope, life of a python object stuck in a << HERE
如果我有兩個功能:
function! foo()
python3 << HERE
import mylib
pass
HERE
function! bar()
python3 << HERE
import mylib
pass
HERE
src說:
1. Python interpreter main program
3. Implementation of the Vim module for Python
因此,是否在vim中嵌入了python解釋器,此外,是否提供了對python的單獨擴展(VIM API的包裝函數)
mylib被編譯為字節碼並加載多少次? 每個vimscript函數是否都有自己的mylib-我可以實例化某些東西並期望它在其他函數中可見嗎? 我有一堆領導函數,它們共享相似的代碼並作用於同一緩沖區,因此我想知道是否可以重用該數據結構。 解釋器加載到內存中的次數:顯然是在vim運行時。
sys.modules
,因此每個Vim實例都將mylib加載一次。 *.pyc
文件中,因此mylib每次更新都會被編譯一次(假設Python能夠檢測到此更新;通常對此沒有問題)。 無論如何,切勿使用python << EOF
,所有插件都應始終使用命名空間函數:例如
壞:
python << EOF
from y import foo, bar
def my_function1():
foo()
def my_function2(i):
bar(i)
for i in range(2):
my_function1()
my_function2(i)
EOF
好:
# pythonx/mymodule.py
from y import foo, bar
def my_function1():
foo()
def my_function2(i):
bar(i)
def start():
for i in range(2):
my_function1()
my_function2(i)
" plugin/myscript.vim
python import mymodule; mymodule.start()
推理:
my_function1
, my_function2
, foo
, bar
, i
顯示在__main__
模塊全局命名空間。 如果您安裝了一些不遵循良好做法的插件(其中有很多),並且似乎定義了不同的foo
或bar
您的插件將無法工作。 否則,如果該插件恰好在您的插件之前被加載,則該插件將無法工作。 python << EOF
每次被重新編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.