繁体   English   中英

Python,VIM:卡在<<这里的python对象的名称空间,范围,寿命

[英]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运行时。

  1. Python解释器确实加载一次。
  2. Python解释器将导入的模块缓存在sys.modules ,因此每个Vim实例都将mylib加载一次。
  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每次被重新编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM