Python,VIM:命名空间,范​​围,生活在一个<<<<<<<<这里

时间:2014-11-05 05:51:33

标签: python vim

如果我有两个功能:

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 个答案:

答案 0 :(得分:1)

  1. Python解释器确实加载了一次。
  2. Python解释器在sys.modules中缓存导入的模块,因此每个Vim实例都会加载一次mylib。
  3. Python解释器将编译后的字节码缓存在文件系统的*.pyc文件中,因此mylib在每次更新时编译一次(假设Python能够检测到此更新;通常它没有问题)。

  4. 在任何情况下,不要使用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_function1模块全局命名空间中出现了my_function2foobari__main__的所有内容。如果你安装了一些不符合良好实践的插件(它们有很多)并且它似乎定义了不同的foobar,那么你的插件将无效。或者,如果它恰好在您的插件之前加载,该插件将无效。
    2. 每次调用
    3. python << EOF时都会重新编译。