Python argparse: nilai default atau nilai yang ditentukan

174

Saya ingin memiliki argumen opsional yang akan default ke nilai jika hanya ada bendera tanpa nilai yang ditentukan, tetapi menyimpan nilai yang ditentukan pengguna alih-alih default jika pengguna menentukan nilai. Apakah sudah ada tindakan untuk ini?

Sebuah contoh:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

Saya dapat membuat tindakan, tetapi ingin melihat apakah ada cara yang ada untuk melakukan ini.

rampok
sumber

Jawaban:

273
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)

  • nargs='?' berarti argumen 0-atau-1
  • const=1 set default ketika ada 0 argumen
  • type=int mengubah argumen menjadi int

Jika Anda ingin test.pymengatur exampleke 1 meskipun tidak ada --exampleyang ditentukan, maka sertakan default=1. Yaitu dengan

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

kemudian

% test.py 
Namespace(example=1)
unutbu
sumber
Bagaimana melakukan ini dengan string? Saya memiliki dilema dengan diferensiasi "" (string kosong sebagai default) dan "" (string kosong seperti yang dimasukkan oleh pengguna). Dalam kode untuk saat ini saya menggunakan default dan karena saya perlu melakukan beberapa operasi, saya memiliki sesuatu seperti ini self.foo = (args.bar or some_else_source).upper(). Ini akan pecah pada Tidak ada objek AFAIUC.
0andriy
16

Sebenarnya, Anda hanya perlu menggunakan defaultargumen add_argumentseperti pada test.pyskrip ini :

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--example', default=1)
    args = parser.parse_args()
    print(args.example)

test.py --example
% 1
test.py --example 2
% 2

Detailnya ada di sini .

Adam Erickson
sumber
7

Perbedaan antara:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)

dan

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

dengan demikian:

myscript.py => debug adalah 7 (dari default) dalam kasus pertama dan "Tidak ada" di yang kedua

myscript.py --debug => debug adalah 1 dalam setiap kasus

myscript.py --debug 2 => debug adalah 2 dalam setiap kasus

Murray
sumber