最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

[python] 使用typing標注在外部腳本編輯器中獲得自動補全

2022-09-18 00:39 作者:小小の我  | 我要投稿

houdini發(fā)布py3版本已經(jīng)一年多了,新版已經(jīng)移除了對py2的兼容支持,我想起來上次發(fā)了篇配置vscode連接houdini的專欄

上期指路:vscode連接houdini配置python開發(fā)環(huán)境

回頭看看這py3不是來了嗎,就分享一下如何在vscode中利用typing標注來獲取自動補全吧

好久沒寫東西的我完全不知道怎么連接vscode,還是照著之前自己的教程一步步做才成功配置好,原來寫教程給人看也就圖一樂,真教程還是得當備忘錄

使用typing模塊可以讓python這種動態(tài)語言能像靜態(tài)語言一樣擁有固定的變量類型,但是大部分時候它不影響代碼的運行,只是對人類起到提示作用,對編輯器起到輔助解析作用

首先來看看沒有typing的時候變量與函數(shù)在vscode中的解析

在vscode中,如果函數(shù)的返回類型是在函數(shù)內(nèi)部就定義好的,那么我們調(diào)用函數(shù)的時候vscode可以幫助我們解析返回值的變量類型,鼠標放在函數(shù)上就能顯示出來

上圖中的函數(shù)內(nèi)部使用了isinstance函數(shù)來分辨var1參數(shù)是否是一個字符串,如果是,foo函數(shù)返回的類型就是字符串,不是的話會返回None(python函數(shù)中沒有return時返回None),所以在下面我調(diào)用了foo函數(shù)時,vscode自動解析出了foo的參數(shù)與返回值的類型

(var1: Any)中的Any的意思就是foo中var1參數(shù)的類型是任何類型都可以的,因為我們沒有指定var1必須是一個str

而后面有一個 -> (str?| None), 代表的是該函數(shù)的返回類型,可能是str或None

這只是一個例子,如果函數(shù)的參數(shù)和返回值都不確定的話就都是Any了

對于內(nèi)部沒有顯式類型操作的函數(shù),就無法判斷具體會返回什么類型了

檢查node參數(shù)是否是subnet,如果是就在內(nèi)部創(chuàng)建一個null

上面這個函數(shù)在houdini中檢查node參數(shù)是否是子網(wǎng)絡(luò)節(jié)點類型,如果是就在其內(nèi)部創(chuàng)建一個null節(jié)點,否則輸出錯誤日志

對于這種很普遍的函數(shù),vscode并不知道node的變量類型,在函數(shù)內(nèi)部操作的時候?qū)嵗椒ǘ际前咨?,代表vscode并不知道這些方法是否存在,而且把返回值賦予給變量,也只能得到一個Any這樣毫無提示作用的結(jié)果

雖然運行起來沒問題,但是碼字的時候完全沒有自動補全,所有方法和屬性都需要手動輸入完整不能出錯,無異于txt中盲打代碼,但我們很清楚這段代碼的運行環(huán)境,也清楚node參數(shù)是一個節(jié)點類型,返回值是hou.Node或None

一個常用的方法是在函數(shù)頂層使用保護條款來確定參數(shù)類型,比如條件語句、assert等操作

一個分離路徑字符串最后一級的函數(shù),split方法是黃色代表能正確解析

對比foo4中的split方法,前兩種函數(shù)里都正確解析出了var的字符串類型

但不停的使用保護條款來確定函數(shù)類型在一套嵌套比較緊密的處理邏輯中既顯得冗余又一定程度加重了運行負擔,而且如果傳入多個不同類型的參數(shù)的話一個個檢查類型簡直像是跑了八百里找個廁所就為放個P


而typing標注正是用來解決這種問題的好幫手

我先簡單說明一下常用方法,深入了解請參考下面typing的官方文檔說明:

https://docs.python.org/zh-cn/3/library/typing.html


typing引入了新的寫法可以在定義變量和函數(shù)的時候讓用戶標注類型,方便編輯器對用戶自定義的變量和函數(shù)做解析

先來定義一個簡單的加法,比如我想輸出一個文件夾的名字加上某天的日期作為后綴,合起來成為txt文件名字

顯示為白色的方法都只能手動輸入,因為沒有自動補全

如果我們確定path_是一個str類型,date_是一個date類型,那就可以在定義形參的時候使用冒號為形參指定類型

這樣調(diào)用方法的時候編輯器就預先知道了參數(shù)類型,也就能幫我們補全了

而對于houdini的hou package中沒有返回值的函數(shù),可以用 -> 標志來標注函數(shù)的返回值類型,比如上面演示的create_dot函數(shù)

為我們的自定義函數(shù)標注輸出類型為hou.Node,之后調(diào)用函數(shù)獲得的變量類型也能被vscode解析到了

但官方文檔說了這個標注并不會影響代碼的運行,也就是說你如果傳入了和標注不匹配的參數(shù)其實并不影響函數(shù)運行,即使報錯也只是代碼的邏輯問題導致的,和typing無關(guān)

比如一個簡單的sum函數(shù)

使用int標注變量類型而傳入字符串參數(shù)

由于兩個字符串和兩個數(shù)字一樣可以進行相加運算, 這個函數(shù)實際不會報錯,但vscode會以我們標注的類型為優(yōu)先參考,假裝沒看見我們傳進去兩個字符串的事情

那么如果我們希望這個函數(shù)既能運算int又能算float和str就要使用合并類型來標注了

要從typing模塊中導入Union為參數(shù)標注多個可能的類型,Union[多個類型,逗號分開]

指定了多個類型之后,補全列表也會把所有可能的方法屬性都列出來

但這個函數(shù)實際上是有可能報錯的,兩個數(shù)字或兩個字符串都可以相加,但一個數(shù)字和一個字符串就不能相加了,或許應(yīng)該用可變參數(shù)定義統(tǒng)一的形參然后附加保護條款防止字符串參與數(shù)字銀趴

好像復雜了不少,所以最終我還是僅僅放了個P是嗎

并不是,只是我舉的例子像個P(而且sum是內(nèi)置函數(shù)),這個sum就到此為止了,還是要繼續(xù)解決hou package的問題,談下一話題

如果只是簡單創(chuàng)建一個變量,并不想把它塞到函數(shù)里的話,可以直接在定義的變量處加標注

這是一個方便的方式,可以直接指定變量類型,但相信做為一個只是偶爾寫個腳本的菜雞cg“藝術(shù)家”的你..和我

一樣,雖然想法天花亂墜,但實際操作往往都是for循環(huán)

selectedNodes和maya中的ls一樣都是返回的一個節(jié)點列表,不能對一個列表標注節(jié)點類型,又不想在for循環(huán)里再加個條件來判斷類型

與Union一樣,typing也可以標注一個容器類型并且為它指定列表內(nèi)對象的類型

在tuple內(nèi)指定對象類型,for循環(huán)自動解析迭代對象的類型

而且容器類型支持嵌套

返回? ?選擇的 多個subnet節(jié)點? 的??子節(jié)點? 的? 兩層嵌套列表,仍然可以正常解析

有一個沒用的知識,對于我們這種經(jīng)常for循環(huán)的人來說,tuple和list大多數(shù)時候都一樣用,只是不同生成邏輯會返回不同的類型

typing中有一個Sequence類型是tuple, list, set這些列表類型的父類,標注形參類型時為這些有相似屬性的容器類型統(tǒng)一使用Sequence,標注返回值時再根據(jù)自己函數(shù)的具體輸出類型標注list或tuple等

返回節(jié)點列表中節(jié)點的輸入節(jié)點的列表

大部分時候要考慮API給的函數(shù)中沒有輸出的情況,所以返回值的List中除了有節(jié)點類型還有None類型

處理鏈式調(diào)用不能補全的情況

對于oop來說鏈式調(diào)用是不可缺少的,但由于hou的解析問題,為了獲得補全難免會破壞這種流暢的調(diào)用方式,我在這里總結(jié)了幾種對于node.parm.eval這種常用獲取屬性值的方式的寫法

我用的是vscode的python默認主題色,你可以把主題調(diào)成更艷一點的顏色來增加獲得補全的成就感

更多類型和自定義類可以參考官方文檔深入了解,我一個臭寫循環(huán)的也就用這些基本功能就夠了

盡管py2已經(jīng)停更幾年了,但是各個軟件因為工程量過于龐大還是最近一兩年才陸陸續(xù)續(xù)加入了對py3的支持

因為本人小圈子內(nèi)都是CG從業(yè)者,并不是程序員出身,學習python也都是從軟件本身出發(fā)的,我發(fā)現(xiàn)很多朋友對于py3基本是毫無性趣,因為軟件不支持

py3相比py2有高得多的便利性,求求某些公司的流程內(nèi)快點更新軟件版本吧


[python] 使用typing標注在外部腳本編輯器中獲得自動補全的評論 (共 條)

分享到微博請遵守國家法律
武冈市| 怀宁县| 四川省| 宜兴市| 宁德市| 普定县| 固始县| 罗源县| 津市市| 黄浦区| 伊春市| 天祝| 剑阁县| 陆丰市| 南雄市| 舟山市| 手机| 宜宾县| 温州市| 宽城| 邵东县| 广安市| 潜山县| 沅陵县| 右玉县| 娄底市| 井研县| 霍林郭勒市| 忻州市| 宁远县| 方正县| 汉沽区| 达日县| 民县| 凤台县| 冷水江市| 二连浩特市| 剑阁县| 遂川县| 南部县| 普兰县|