pyi文件是幹嗎的?(一文讀懂Python的存根文件和類型檢查)

  參考資料:html

  https://blog.csdn.net/weixin_40908748/article/details/106252884python

  https://www.python.org/dev/peps/pep-0484/函數

  https://www.jetbrains.com/help/pycharm/stubs.html工具

  寫這篇文章的緣由是我在網上下載的項目中看到了.pyi文件,可是尋找了不少資料纔對這些個概念(存根文件、類型檢查)有了一個直觀的印象。這篇隨筆的目的是用最短的篇幅讓你理解這些概念!測試

  首先我介紹幾個論斷:this

  1. PEP484spa

  首先PEP是Python社區使用的規範化文檔(就好像IETF用的rtf),PEP484這個文檔是對type hint做規範化的文檔!它規範化了type hint所需的語法用法...好比若是你關心stub存根文件是怎麼作規範化的,你能夠看參考資料2。.net

  2.type checkercode

  PEP484只是一個規範化的文檔,沒有給出具體的hint軟件。事實上有一個內置模塊叫typing,但它是讓你用規範的語法寫type hint的。不是一個類型檢查器!!!htm

  問:有哪些類型檢查器可用?答:Pycharm內置有type checker,而且可用,明確支持stub file。mypy這個軟件明確支持stub。其餘的hinter,pyhinter等...我測試了一下,在vscode中效果不理想。

  3.來看看,一個最簡單的type hint,一個最簡單的stub file長什麼樣

  一個最簡單的帶annotation(type hint)的函數定義:

def greeting(name: str) -> str:
    return "Hello" + name

  一個最簡單的stub file:

def greeting(name: str) -> str: ...

  4.後綴爲.pyi的stub存根文件的做用:

  當沒有存根文件,同時在函數定義的時候不加annotation的狀況:

   可見,因爲python沒有內置靜態類型檢查,只有運行時的動態檢查。Pycharm給這個在運行時會出錯的文件打了小對勾。

  可是,當咱們在同一個文件夾下寫一個stub file以後呢?

   有了stub file的指引,有了Pycharm內置的type checker作靜態檢查驅動。在代碼沒有運行的時候就檢查出來了類型錯誤!!這在維護大型的項目的時候是很是有用的。


 

  看了上面這幾個論斷,你是否是對相關的概念有了一個初步的理解?下面咱們本身動手作一個實驗,目的是在一個文件夾中寫module並定義函數,在另外一個文件夾中統一存放存根文件(由於方便管理呀,而且可以屢次使用實現複用!)並且咱們已經知道了,type checker這個活不是必須的,能夠由mypy,Pycharm來幹,那麼咱們想找到指導固然要尋求這些工具的指導。好比:Pycharm的stub說明。https://www.jetbrains.com/help/pycharm/stubs.html#create-stub-external,廢話很少說,動手作一作。

  第一步:

  生成代碼文件和存根文件,其中存根文件放到一個統一的文件夾中統一存放。

 

  第二步:

  按照Pycharm文檔中的指引,將存根文件的目錄添加到PATH中,必定要注意文件名要對應上。(在IDE中能夠方便的配置,當真正工程上應用的話可能就要手動添加PATH了,但要注意:hints是給人看的,類型檢查也是給人警告的,不能脫離應用)

Reuse stubs

You can make your stubs accessible for your other PyCharm projects.

  1. Click the Project Interpreter selector in the Status Bar and select Interpreter Settings.

    Interpreter Settings menu
  2. In the Project Interpreter dialog, click Browse and select Show All, then in the opened Project Interpreters dialog, click Show paths for the selected interpreter.

  3. In the Interpreter paths dialog, click the Add button to add the new path record:

    Adding the path
  4. Inspect your project: the directory with the stub files is now marked as a library root.

    A stub directory that is marked as a library root

Any time you will use this project interpreter to work with other projects, this stub library will be accessible through the path you have just added.

   

  第三步:

  看一下結果,發現兩個module文件都找到了對應的存根。其中在最左邊出現了 * ,點擊的話能夠在實現以及存根中跳轉。

相關文章
相關標籤/搜索