關於使用pyqt5出現 "parameter 'flags' unfilled" 的警告信息

出現警告的代碼如下:

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = QWidget()  # <-- 這裏是出現黃色警告地方, 警告信息: "parameter 'flags' unfilled"
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    
    sys.exit(app.exec_())

雖然運行不會有問題, 但是作爲有強迫症的人想要消除這個警告. 那麼先找到它的原因.

按 ctrl + b 定位源碼, 長這個樣子:

def __init__(self, parent=None, flags, Qt_WindowFlags=None, Qt_WindowType=None, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__
    pass

從參數上來看, parent 是有默認參數的, flags 卻沒有, 很明顯是 “錯誤” 的寫法, pyqt 官方會出現這種錯誤嗎?

這個回答 來看, 這裏的正確寫法應該是:

def __init__(self, parent:QWidget = None, flags:Union[Qt.WindowFlags, Qt.WindowType]=Qt.WindowFlags()):
    pass

也就是說初始化中只有 parent 和 flags 兩個參數, 問題是出在這個註釋上: # real signature unknown; NOTE: unreliably restored from __doc__

這個註釋的作用是, 將從 __doc__ 中恢復正常的傳參. 在源碼文件中也確實能夠找到正確的寫法:

在這裏插入圖片描述

也就是說, 官方的寫法並沒有錯, 只是在運行時纔會被正確地生成, 至少排除了官方失誤這種低級問題. 反過來說就是 pycharm 在 “智能檢測” 功能上做得還不夠完善.

那麼如何消除這個黃色警告, 就只好從 ide 上入手了.

方法1是設置本項目忽略這個錯誤情況 (好處是該屏蔽規則只在本項目有效, 壞處是如果本項目的其他地方, 特別是自己寫的類如果忘了傳參就只能等運行時報錯了), 方法2是隻忽略本行代碼的報錯, 即在這行前面加一個suppress:

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)

    # 加一個suppress規則:
    # noinspection PyArgumentList
    w = QWidget()  # 這樣這裏的警告就消失了
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    
    sys.exit(app.exec_())


參考:

  1. https://stackoverflow.com/questions/40835014/pyqt5-non-default-parameter-after-default-parameter
  2. https://stackoverflow.com/questions/38384206/why-do-some-built-in-python-functions-only-have-pass
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章