簡體   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