私は次の動作を取得しようとしています:
私が使用すると動作します
parser.add_argument('--foo',nargs='?', default=False, const=True)
ただし、type=bool
を追加すると、ブール値へのキャストを強制しようとして失敗します。この場合
python test.py --foo False
実際にはfoo=True
を保存することになります。どうしたの??
sureそのパターンが必要ですか? --foo
と--foo <value>
は、ブールスイッチの場合、一緒に使用する一般的なパターンではありません。
あなたの問題に関しては、コマンドラインの値はstringであり、type=bool
はbool(entered-string-value)
を適用することを意味することを覚えておいてください。 --foo False
の場合はbool("False")
を意味し、True
を生成します。空でない文字列はすべて真です! なぜargparseはブール値フラグを正しく解析しないのですか? も参照してください。
--foo
/--foo <string value>
をサポートする代わりに、strongly--foo
を使用してTrue
を意味することを推奨し、引数値をドロップし、代わりにFalse
を明示的に設定する--no-foo
オプション:
parser.add_argument('--foo', default=False, action='store_true')
parser.add_argument('--no-foo', dest='foo', action='store_false')
dest='foo'
スイッチに--no-foo
オプションを追加すると、_store_false
属性で保存されるFalse
値が(args.foo
を介して)確実に終了します。
foo
をTrue
に設定する他の構成メカニズムがあり、コマンドラインスイッチでこれを再度オーバーライドする必要がある場合にのみ、--foo / --no-foo
の組み合わせが必要になります。 --no-<option>
は、ブール型のコマンドラインスイッチを反転させるために広く採用されている標準です。
do n'tに--no-foo
反転スイッチが特に必要な場合(単にomitting--foo
はすでに 'false'を意味するため) action='store_true'
オプションを使用するだけです。これにより、コマンドラインがシンプルかつ明確になります。
ただし、ユースケースまたはその他の制約により、コマンドラインmustが--foo (true|false|0|1)
サポートの王を必要とする場合は、独自のコンバーターを追加します。
def str_to_bool(value):
if isinstance(value, bool):
return value
if value.lower() in {'false', 'f', '0', 'no', 'n'}:
return False
Elif value.lower() in {'true', 't', '1', 'yes', 'y'}:
return True
raise ValueError(f'{value} is not a valid boolean value')
parser.add_argument('--foo', type=str_to_bool, nargs='?', const=True, default=False)
const
値は、nargs='?'
引数に使用され、引数値は省略されます。ここでは、foo=True
が使用されるときに--foo
を設定します。default=False
は、スイッチがまったく使用されない場合に使用されます。type=str_to_bool
は、--foo <value>
ケースの処理に使用されます。デモ:
$ cat so52403065.py
from argparse import ArgumentParser
parser = ArgumentParser()
def str_to_bool(value):
if value.lower() in {'false', 'f', '0', 'no', 'n'}:
return False
Elif value.lower() in {'true', 't', '1', 'yes', 'y'}:
return True
raise ValueError(f'{value} is not a valid boolean value')
parser.add_argument('--foo', type=str_to_bool, nargs='?', const=True, default=False)
print(parser.parse_args())
$ python so52403065.py
Namespace(foo=False)
$ python so52403065.py --foo
Namespace(foo=True)
$ python so52403065.py --foo True
Namespace(foo=True)
$ python so52403065.py --foo no
Namespace(foo=False)
$ python so52403065.py --foo arrbuggrhellno
usage: so52403065.py [-h] [--foo [FOO]]
so52403065.py: error: argument --foo: invalid str_to_bool value: 'arrbuggrhellno'
ブール引数の代わりに action='store_true'
パラメーターを使用する必要があります。
parser.add_argument('--foo', action='store_true')
--foo
オプションがないため:
python test.py
False
引数のfoo
値、および--foo
オプションの存在になります。
python test.py --foo
True
引数のfoo
値になります。