Является ли инспекция 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 на ваш сердечный контент.