亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何發現類重新定義?

如何發現類重新定義?

斯蒂芬大帝 2021-06-29 09:00:27
這是一個非常簡單的設置:class A(object):    x = 1class B(object):    x = 2class C(object):    x = 3class B(B):    x = 4class C(object):    x = 5print A.x, B.x, C.x輸出預期:1, 4, 5是否有可能檢測到 B 已被“重新定義”但 C 已被“替換”?是在創建階段還是隨后通過檢查對象?這些類被用作配置對象,上面有一個加載器類,它導入模塊,然后自省以找到類及其屬性,然后應用程序將它們用于實例命名參數。例如class tcp_port(number):    minimum = 1024    maximum = 2048實際上,python 只是用作一種方便的腳本語言來定義主應用程序中的參數。這些文件可供最危險的人編輯: 客戶 因此,要求能夠在運行時檢測類是否(意外地)重用了已定義的名稱,但要安全地通過偶爾的情況其中一個類被重新定義,然后調整或添加一些屬性:class tcp_port(tcp_port):    maximum = 4096所以......我希望有一些運行時健全性檢查程序,而不是類似 lint 的解決方案。此外,這需要在定義類而不是實例化時發生。...是否有全局函數被調用來創建一個類(或任何其他對象)?有點像有__new__但在全球范圍內?
查看完整描述

2 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

如果該類是就地重新定義的,它將在 MRO 中保留其自身的舊版本:


>>> [x for x in A.mro() if x.__name__ == A.__name__]

[__main__.A]

>>> [x for x in B.mro() if x.__name__ == B.__name__]

[__main__.B, __main__.B]

>>> [x for x in C.mro() if x.__name__ == C.__name__]

[__main__.C]

所以你可以檢測到這種情況:


def has_redefinition_inplace(classobj):

    types = [x for x in classobj.mro() if x.__name__ == classobj.__name__]

    return len(types) > 1

這不會是 100% 可靠的,因為可能存在從不同模塊進入 MRO 的合法沖突類名稱。


查看完整回答
反對 回復 2021-07-06
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

一個好的 linter 會警告沒有使用的重新聲明。一個好的 IDE 會直接在編輯器中 lint。

例如,PyCharm 將使用警告顏色突出顯示這些類名:

http://img1.sycdn.imooc.com//60e3c89c0001ba6605140359.jpg

發現這些問題的另一個好方法是在您的測試套件中使用覆蓋率。名稱被覆蓋的函數(常見的復制粘貼錯誤)在函數體中不能有測試覆蓋。


查看完整回答
反對 回復 2021-07-06
  • 2 回答
  • 0 關注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號