2017-04-21 1 views
15

私はPython 3を使用して、デフォルトで formatter_class=argparse.RawDescriptionHelpFormatterを設定するカスタムクラスでargparse.ArgumentParserを折り返したいと思っています。しかし私は、Pythonのプラグイン(PyCharm)とのIntelliJ IDEA 2017.1は、次のコードに対して警告を与え、これを正常に行うことができます。IntelliJ Python 3の検査で、「辞書を予期し、辞書を取得しました」が** kwargsのスーパーに対して偽陽性ですか?

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 

1は、IntelliJの抑制コマンドを使用して、コメントを削除した場合kwargsからの警告は、「辞書を期待されています、dictを持っている "しかし、それは働いています。これは偽陽性の警告ですか、これは警告なしでもうまくできますか?この警告の背後にある本当の問題は、避けることができるということですか?

サイド質問:署名に名前付きパラメータを明示的に定義するのではなく、
formatter_class = kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)を使用することに違いはありますか? PEP20によれば、より明示的に署名が明白ですよね?

+0

私は今もまた別の警告があります。 'CustomParser(formatter_class = argparse.HelpFormatter) 'を使ってデフォルトのフォーマッタを変更したいのであれば、'予想される型'の型[RawDescriptionHelpFormatter] 'があり、 '#[noFormpection] 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で説明しました。これは単なるバグで、pycharm 2017.3.3 RCで修正されました。 cf簡単なリピートバイベースのバグhttps://youtrack.jetbrains.com/issue/PY-27686 –

+0

リンクされたバグの懸念がPython 2のみであるようですが、このpython 3の偽陽性の警告はこのリリースで解決されていますか?私は時間を見つけたらこれを更新して確認します。 – jan

関連する問題