2017-03-21 11 views
2

私はpython 2.7.13を使用しています。pythons argparseのデフォルト値が機能しません

parser.add_argument("-r", nargs=3, default=(0, 1000, 50), type=int, help="Useful help text") 

これは私のために動作しません、と私はどこにもあれば見つけることができません。

私の目標は引数がユーザによって指定されていない場合は、デフォルト値が設定された状態で、三つの可能な引数を持つことです上記のような方法でデフォルトを使用することは可能です。

program.py -rとして、それを実行しているとき、私はエラーを取得:3引数(複数可)

を期待しかし、私はまた、完全にNARGSを除去して、唯一のデフォルト値持ってみました。不思議なことに

parser.add_argument("-r", default=100) 

を、このいずれも機能しません。少なくとも1つの引数が必要です...

誰でもこれを理解できますか?

+0

program.py -rで実行すると、argparseにはいくつかのパラメータが必要です。-rフラグをスキップすると、デフォルト値が使用されます。 – rammelmueller

答えて

1

デフォルト値を使用していない場合は、引数-rを呼び出すだけで済みます。呼び出しを行う場合は、値を渡す必要があります(または、nargsで定義した値を渡す必要があります)。

は、あなたがargvを使用しない理由だけprogram.py

+0

さて、もし何があっても-rを使用できるようにしたいのであれば、私はどうしますか?私は他のフラグも持っているので、引数の有無にかかわらず-rを使用できるようにしたい。もちろん引数が与えられていなければデフォルト値を持ちます。これは可能ですか? – AltoBalto

+0

引数なしで '-r'とは何ですか? – hpaulj

+0

フラグなしでprogram.pyを呼び出すときは、すべてのフラグのデフォルト値が必要であることを意味します。もしそうでなければ、そう言わなければなりません;)したがって、デフォルト値で-rを使いたい場合は、それを言及せずに、argarseにデフォルト値を静かに割り当てさせます。なんらかの理由で-rに言及する必要があるのであれば、そのデフォルト値を明示的に渡すだけです。 – mknull

0

を呼び出してみては?

例:あなたがつながることになる-rフラグなしでアプリケーションを呼び出すことができますいずれかのあなたの例では

python myprogram.py   # will print 1 2 3 
python myprogram.py 7  # will print 7 2 3 
python myprogram.py 7 8  # will print 7 8 3 
python myprogram.py 7 8 9 # will print 7 8 9 
+0

* before sys.argvは何を表していますか? – AltoBalto

0

import sys 

def main(first=1, second=2, third=3): 
    print first,second,third 

if __name__ == '__main__': 
    main(*sys.argv[1:])  # notice the * before sys.argv[1:] 

あなたはパラメータの数が異なるコンソールからファイルを実行してテストすることができますデフォルト値で使用します。値を自分で指定したい場合は、それらすべてを与える必要があります。

あなたが独立してそれらを入力したい場合は、このような何かを試みることができる:あなたはこのように(main1)実装を呼び出すことができます

# script.py 
import argparse 

def main1(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument("-r", nargs=3, default=(0, 1000, 50), type=int, 
         help="Useful help text") 
    args = parser.parse_args() 
    print(args) 

def main2(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument("-r1", type=int, default=0, help="...") 
    parser.add_argument("-r2", type=int, default=1000, help="...") 
    parser.add_argument("-r3", type=int, default=50, help="...") 
    args = parser.parse_args() 
    print(args) 

if __name__ == "__main__": 
    main1() 
    #main2() 

を:

$ python script.py 
Namespace(r=(0, 1000, 50)) 
$ python script.py -r 1 2 3 
Namespace(r=[1, 2, 3]) 
$ python script.py -r 1 
usage: args.py [-h] [-r R R R] 
args.py: error: argument -r: expected 3 arguments 

を個別の引数をあなたの呼び出しを使用する可能性このような(main2):

$ python script.py -r1 1 -r2 2 -r3 3 
Namespace(r1=1, r2=2, r3=3) 
$ python script.py -r1 1 
Namespace(r1=1, r2=1000, r3=50) 
$ python script.py -r2 2 
Namespace(r1=0, r2=2, r3=50) 
$ python script.py -r3 3 
Namespace(r1=0, r2=1000, r3=3) 

すべての値を変更したい場合は、少しばかり言い方ができますが、柔軟性が増します。私はmutually_exclusive_groupを使ってこれら2つのアプローチを組み合わせることもできると思います。

3

私は

In [32]: parser = argparse.ArgumentParser() 

は3つのアクションの定義(Ipythonインタラクティブセッションで)​​にdefaultの正常な動作を示します:

In [33]: parser.add_argument('-r', nargs=3, type=int, default=(1,2,3)); 
In [35]: parser.add_argument('-f', default='DEFAULT'); 
In [37]: parser.add_argument('-g', nargs='?', default='DEFAULT', const='const'); 

helpを。

In [39]: parser.print_help() 
usage: ipython3 [-h] [-r R R R] [-f F] [-g [G]] 

optional arguments: 
    -h, --help show this help message and exit 
    -r R R R 
    -f F 
    -g [G] 

いかなるargmentsなしで呼び出された場合は、デフォルト値のすべてがargs名前空間に表示されます。すべてのアクションは[]、彼らはオプションであることを示していることに注意してください。 (NARGSによって指定されるように)

In [40]: parser.parse_args([]) # e.g python myprog.py 
Out[40]: Namespace(f='DEFAULT', g='DEFAULT', r=(1, 2, 3)) 

In [41]: parser.parse_args('-r 4 5 6'.split()) 
Out[41]: Namespace(f='DEFAULT', g='DEFAULT', r=[4, 5, 6]) 

は、他のフラグのいずれかを指定する3つの数字で-rを与えます。残りのデフォルトnargs='?'

In [42]: parser.parse_args('-f other'.split()) 
Out[42]: Namespace(f='other', g='DEFAULT', r=(1, 2, 3)) 

-g別のオプションを持っていることに注意してください。それは引数なしで与えることができます。その場合、値はconstになります。

In [43]: parser.parse_args('-f other -g'.split()) 
Out[43]: Namespace(f='other', g='const', r=(1, 2, 3)) 
In [44]: parser.parse_args('-f other -g more'.split()) 
Out[44]: Namespace(f='other', g='more', r=(1, 2, 3)) 

nargs=3のような3ウェイオプションはありません。 3つの値を指定するか、-rを使用しないでください。 1)no-rフラグ、2)引数なしのrフラグ、3)引数の3つのr flatを区別する必要がある場合は、2つのアクション、1つの 'store_true'、および3値。

​​のデフォルト値は、文字列と非文字列の値の差異を抑止する方法であっても、さまざまな設定方法があります。しかし、私は基本的な行動を示しました。

関連する問題