2017-04-21 69 views
15

我使用Python 3,並且想要使用默認設置爲 formatter_class=argparse.RawDescriptionHelpFormatter的自定義類來包裝argparse.ArgumentParser。我能成功地做到這一點,但是IntelliJ IDEA的2017.1與Python插件(PyCharm)給出了下面的代碼警告:是IntelliJ Python 3檢查「期待字典,得到一個字典」對超級**錯誤肯定是?

class CustomParser(argparse.ArgumentParser): 
def __init__(self, formatter_class=argparse.RawDescriptionHelpFormatter, **kwargs): 
    # noinspection PyArgumentList 
    super().__init__(formatter_class=formatter_class, **kwargs) # warning in this line for the last argument if suppression comment above removed 

如果一個刪除與的IntelliJ抑制comment命令上kwargs警告是「預期的字典,得到了一個字典「,但它的工作。這是一個錯誤的肯定警告還是沒有警告可以做得更好?這個警告背後有一個真正的問題,它有助於避免?

方面的問題:使用
formatter_class = kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)而不是顯式定義簽名中的指定參數有什麼區別嗎?根據PEP20更明確的簽名更好,對嗎?

+0

我現在也看到另一個警告。如果我想用'CustomParser(formatter_class = argparse.HelpFormatter)'改變默認的格式化程序''我有警告'Expected type'Type [RawDescriptionHelpFormatter]',得到'Type [HelpFormatter]'而不是'可以用'#noinspection PyTypeChecker'。這也是誤報嗎? – jan

回答

5

是的,這似乎是一個誤報。你問過關於formatter_class=kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)。請不要這樣做。作爲下一個參數出現的變異kwargs似乎不好。此外,默認關鍵字args應該設置爲簡單的常量而不是一些可變的數據結構,因爲在導入時評估和運行時評估之間存在很大差異。見例如http://www.effbot.org/zone/default-values.htm。通常的習慣用法是簽名中的formatter_class=None,然後在你測試None的正文中,你將kwargs變爲你心中的內容。

+0

你知道一個方便的例子嗎,這個警告是一個真正的問題,而不是一個誤報?自從最後一個問題以來,我在Python中沒有做太多的事情,看起來像一個非常簡單的錯誤,對吧? – jan

+3

一週前,Pavel Karateev在https://youtrack.jetbrains.com/issue/PY-27935中解釋說,這只是一個bug,現在已經在pycharm 2017.3.3 RC中修復;比較簡單的重複在基本錯誤https://youtrack.jetbrains.com/issue/PY-27686 –

+0

它看起來像你鏈接的錯誤只涉及蟒蛇2,你確定這個蟒蛇3錯誤肯定警告是解決這個版本?如果我找到時間,我會更新並驗證。 – jan