2015-11-06 2 views
8

Эй, поэтому я использую argparse, чтобы попытаться генерировать ежеквартальный отчет. Это то, что код выглядит следующим образом:ТипError: __init __() получил неожиданный аргумент ключевого слова 'type' в argparse

parser = argparse.ArgumentParser() 

parser.add_argument('-q', "--quarter", action='store_true', type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 
parser.add_argument('-y', "--year", action='store_true',type=str,help="Enter a year in the format YYYY ") 
args = parser.parse_args() 

ошибка я получаю это:

TypeError: init() got an unexpected keyword argument 'type'

, насколько я могу сказать от argparse типа документации является одним из параметров функции add_argument. Я попытался удалить это и обновление кода:

parser = argparse.ArgumentParser() 

parser.add_argument('-q', "--quarter", action='store_true', help="Enter a Quarter number: 1,2,3, or 4 ") 
parser.add_argument('-y', "--year", action='store_true',help="Enter a year in the format YYYY ") 
args = parser.parse_args() 

Затем я попытался запустить его с: python scriptname.py -q 1 -y 2015 и он дает мне следующую ошибку:

error:unrecognized arguments: 1 2015

Я не знаю, почему это или. Может ли кто-нибудь пролить свет на это.

+0

Пожалуйста, переформатируйте этот код, его трудно прочитать - 4 символа перед каждой строкой сделают его блоком кода. – davejagoda

+1

Почему вы используете 'action = 'store_true''? Как вы понимаете, что это будет делать? – user2357112

+0

Далее в коде я делаю чек, чтобы проверить, соответствуют ли переменные, хранящиеся в argparse. если они я исполняю некоторый код. –

ответ

12

Что означает action="store_true" означает, что если аргумент указан в командной строке, то значение True должно храниться в синтаксическом анализаторе. Фактически вы хотите сохранить данный год (как строку) и квартал (как int).

parser = argparse.ArgumentParser() 

parser.add_argument('-q', "--quarter", type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 
parser.add_argument('-y', "--year", type=str, help="Enter a year in the format YYYY ") 
args = parser.parse_args() 

При указании action='store_true argparse внутренне инстанцированием _StoreAction экземпляра, конструктор не принимает параметр type (так как он всегда будет логическим значения (True/False)). Вы не можете поставить action="store_true" и «type» одновременно.

+0

спасибо большое, это было очень проницательно –

1

Документация argparse не так подробно, как могла бы быть (но все еще имеется больше информации, чем многие пользователи могут ее поглотить).

В частности, фактическая информация, необходимая для обсуждения, зависит от action.

parser.add_argument('-q', "--quarter", action='store_true', type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 

store_true действие не принимает никаких параметров (т.е. nargs = 0). Значение по умолчанию - False, а при использовании атрибута установлено значение True.

Если вы хотите, чтобы пользователь, чтобы дать один из этих четырех чисел, я предложил бы использовать

parser.add_argument('-q', '--quarter', type=int, choices=[1,2,3,4], help="...") 

https://docs.python.org/3/library/argparse.html#choices имеет аналогичный пример.

Примеры в https://docs.python.org/3/library/argparse.html#action дают довольно хорошее представление о том, какие параметры выполняет каждый класс действий.

Существует ошибка/проблема Python, обсуждающая улучшение документации или сообщение об ошибке при отсутствии ненужных параметров в функции. В его основе это определение подкласса Python выдает сообщение об ошибке.

+0

Спасибо большое! Я попробую это и посмотрю, работает ли он –

+0

. Интересно, поэтому встроен аромат «optionality», не нужно делать «nargs =»? », например, что, по-видимому, конфликтует с встроенным/стандартным дизайном. – jxramos

+0

Базовый класс 'Action' имеет 2 параметра и 8 параметров ключевых слов. Но для подкласса «store_true» подкласса '_StoreTrueAction' только 3 из этих ключевых слов находятся в' '__init__', и только' help' имеет смысл. Наследование классов дает большую гибкость, но иногда затрудняет точную документацию. – hpaulj

Смежные вопросы