Відповіді:
store_true
Опція автоматично створює значення за замовчуванням значення False .
Так само store_false
за замовчуванням буде встановлено значення True, якщо аргумент командного рядка відсутній.
Джерело такої поведінки є коротким та зрозумілим: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861
Документи argparse незрозумілі з цього питання, тому я зараз їх оновлюю : http://hg.python.org/cpython/rev/49677cc6d83a
Реймонд Хеттінгер вже відповідає на питання ОП.
Однак у моєї групи виникли проблеми з читальністю за допомогою "store_false". Особливо, коли до нашої групи приєднуються нові члени. Це тому, що найбільш інтуїтивно зрозуміти спосіб полягає в тому, що коли користувач вказує аргумент, значення, відповідне цьому аргументу, буде True або 1.
Наприклад, якщо код -
parser.add_argument('--stop_logging', action='store_false')
Зчитувач коду, можливо, очікує, що оператор журналу буде вимкнено, коли значення стоп-журналу є істинним. Але такий код, як наведено нижче, призведе до протилежної бажаної поведінки -
if not stop_logging:
#log
З іншого боку, якщо інтерфейс визначений наступним чином, "if-заява" працює і є більш інтуїтивно зрозумілим -
parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
#log
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.
Файл store_false фактично 0
за замовчуванням (ви можете перевірити, щоб перевірити). Щоб змінити те, для чого він за замовчуванням, просто додайте default=True
до своєї декларації.
Отже, у цьому випадку:
parser.add_argument('-auto', action='store_true', default=True)
>>> parser.add_argument('--bar', action='store_false')
_StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args([])
Namespace(bar=True)
-bar
, то значенняdest
автоматично встановлюється наbar
основі hg.python.org/cpython/rev/49677cc6d83a . Однак я не бачу, де ця поведінка за замовчуванням встановлена в коді. Я завжди встановлювавdest
аргумент прямо. Крім того , я думаю , дозволяючи поbar
замовчуванням доdest
для--bar
опції не має сенсу , якщо--bar
єstore_false
. Чи не повинноdest
бутиnotbar
в цьому випадку?