Является ли инспекция IntelliJ Python 3 "Ожидаемый словарь, получивший диктовку" ложным положительным для супер с ** kwargs?

Я использую Python 3 и хочу обернуть argparse.ArgumentParser специальным классом, который устанавливает formatter_class=argparse.RawDescriptionHelpFormatter по умолчанию. Я могу сделать это успешно, однако IntelliJ IDEA 2017.1 с плагином Python (PyCharm) дает предупреждение для следующего кода:

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, предупреждение о kwargs означает "Ожидаемый словарь, получивший dict", однако он работает. Это ложное положительное предупреждение или это можно сделать лучше без предупреждения? Есть ли проблема в этом предупреждении, что это помогает избежать?

Боковой вопрос: есть ли разница в использовании formatter_class = kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter) вместо явного определения именованного параметра в подписи? Согласно PEP20 более явным в подписи лучше, правильно?

Ответы

Ответ 1

Да, это кажется ложным.

Вы спросили о formatter_class=kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter). Пожалуйста, не делай этого. Мутирование kwargs, которое появляется в качестве следующего аргумента, кажется плохим. Кроме того, аргументы ключевого слова по умолчанию должны быть установлены как простая константа, а не какая-то изменяемая структура данных, так как существует большая разница между оценкой времени импорта и оценкой во время выполнения. См. http://www.effbot.org/zone/default-values.htm. Обычная идиома была бы formatter_class=None в сигнатуре, а затем в теле, которое вы проверяете на None, и вы мутируете kwargs на ваш сердечный контент.