argparse deposu belirtilmemişse yanlış


105
parser.add_argument('-auto', action='store_true')

-autoBelirtilmemişse nasıl yanlış depolayabilirim ? Bu şekilde, belirtilmemişse Hiçbirini depoladığını hafifçe hatırlayabiliyorum

Yanıtlar:


173

store_trueSeçeneği otomatik varsayılan değeri oluşturur Yanlış .

Benzer şekilde, komut satırı argümanı olmadığında store_falsevarsayılan olarak True olacaktır .

Bu davranışın kaynağı kısa ve özdür: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

Argparse belgeleri konu hakkında net değil, bu yüzden şimdi güncelleyeceğim: http://hg.python.org/cpython/rev/49677cc6d83a


2
Bununla ilgili birkaç yorum. Birincisi, seçenek ise görünüyor -bar, daha sonra destotomatik olarak ayarlanır bardayalı hg.python.org/cpython/rev/49677cc6d83a . Ancak, bu varsayılan davranışın kodda nerede ayarlandığını görmüyorum. Ben her zaman destargümanı açıkça belirledim . Ayrıca, izin düşünüyorum bariçin varsayılan destiçin --bareğer gerçekten mantıklı değil seçeneği --barolduğunu store_false. Olmamalı destolmak notbarbu durumda?
Faheem Mitha

6
Zıt adlandırma kuralını anlamadım.
brainLoop

Katılıyorum, bu biraz kafa karıştırıcı. Her neyse, "yanlış mağaza" veya "mağaza_doğru" eylem olarak belirtilir ve varsayılan bir değer değil. Böylece programa bu argümanı eklediğinizde, belirtilen eylem tetiklenir.
ady

15

İle

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

koşma

% test.py

verim

Namespace(auto=False)

Yani Falsevarsayılan olarak depoluyor gibi görünüyor .


3

Raymond Hettinger, OP'nin sorusuna şimdiden cevap veriyor.

Ancak, grubum "store_false" kullanarak okunabilirlik sorunları yaşadı. Özellikle grubumuza yeni üyeler katıldığında. Bunun nedeni, düşünmenin en sezgisel yolu, bir kullanıcı bir argüman belirlediğinde, o argümana karşılık gelen değerin True veya 1 olacağıdır.

Örneğin, kod -

parser.add_argument('--stop_logging', action='store_false')

Kod okuyucu, stop_logging'deki değer doğru olduğunda, günlükleme ifadesinin kapalı olmasını bekleyebilir. Ancak aşağıdaki gibi bir kod , istenen davranışın tersine yol açacaktır -

if not stop_logging:
    #log

Öte yandan, arayüz aşağıdaki gibi tanımlanmışsa, "if-ifadesi" çalışır ve okuması daha sezgiseldir -

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log

7
Sen okunabilirliği artırmak katacağı bir hedef diğer adı ayarlayabilirsiniz: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi

-4

store_false aslında varsayılan olarak 0varsayılan olacaktır (doğrulamak için test edebilirsiniz). Varsayılanı değiştirmek default=Trueiçin beyanınıza eklemeniz yeterlidir.

Yani bu durumda: parser.add_argument('-auto', action='store_true', default=True)


Python 2.7 ve 3.4'te durum böyle görünmüyor: >>> 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)
Leynos

2
üzgünüm, bu aslında optparse'ın varsayılan davranışıdır. argparse varsayılan olarak deponun tersini almalıdır. yani, "yanlış sakla" varsayılanı "Doğru" dur.
Unix-Ninja
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.