Python,VIM:命名空间,范围,卡在<<中的python对象的生命周期 这里



如果我有两个函数:

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

因此,python解释器是否嵌入在vim中?此外,它们是对python的单独扩展(vim API的包装器函数)

mylib编译成字节码并加载了多少次?每个vimscript函数都有自己的mylib吗?我可以实例化一些东西并期望它在另一个函数中可见吗?我有一堆leader函数,它们共享相似的代码,并在同一个缓冲区上运行,所以我想知道是否可以重用该数据结构。解释器被加载到内存中的次数:一次显然是在vim运行时。

  1. Python解释器确实加载过一次
  2. Python解释器在sys.modules中缓存导入的模块,因此mylib在每个Vim实例中加载一次
  3. Python解释器将编译后的字节码缓存在文件系统的*.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()

推理:

  1. 在上面的示例中,所有my_function1my_function2foobari都出现在__main__模块的全局命名空间中。如果你安装了一些不符合良好实践的插件(有很多),并且似乎定义了不同的foobar,你的插件将无法工作。或者,如果该插件恰好在您之前加载,则该插件将不起作用
  2. python << EOF每次被调用时都会被重新编译

相关内容

最新更新