2017-05-04 1 views
0

は私がargparserを使ってフラグを追加するには?

def add(x,y): 
    print x+y 

def square(a): 
    print a**2 

は私が

#! /usr/bin/python 


import argparse 
# Create Parser and Subparser 
parser = argparse.ArgumentParser(description="Example ArgumentParser") 
subparser = parser.add_subparsers(help="commands") 

# Make Subparsers 
hello_parser = subparser.add_parser('hello', help='hello func') 
hello_parser.add_argument("arg",help="string to print") 
hello_parser.set_defaults(func='hello') 

add_parser = subparser.add_parser('add', help="add func") 
add_parser.add_argument("x",type=float,help='first number') 
add_parser.add_argument("y",type=float,help='second number') 
add_parser.set_defaults(func='add') 

square_parser = subparser.add_parser('square', help="square func") 
square_parser.add_argument("a",type=float,help='number to square') 
square_parser.set_defaults(func='square') 

args = parser.parse_args() 

def hello(arg): 
    print arg 

def add(x,y): 
    print x + y 

def square(a): 
    print a**2 

if args.func == 'hello': 
    hello(args.arg) 
elif args.func == 'add': 
    add(args.x,args.y) 
elif args.func == 'square': 
    square(args.a) 

は、私はフラグを追加することができ、このコードを試してみました

./hello.py -a add 2 3 
./hello.py -s sqare 3 

のRightNowのよう​​を使用して、これらの機能のためのフラグを作ることができ、このような機能を持っています同じコード??

+0

あなたは[doc](https://docs.python.org/2/howto/argparse.html)を読んだことがありますか? – Anzel

+0

私は読んだけど、リアルタイムで応募できません。一例を挙げて私に説明してください。ありがとうございました。 – sowji

+0

['click'](http://click.pocoo.org/6/api/#click.confirmation_option)、人々 –

答えて

1

端はあなたのような例があるが、add_parser.set_defaults(func=add)ような表現と(名前の代わりに実際の機能を使用して)。これにより、スタックをargs.func(args)に置き換えることができます。

しかし、あなたはむしろsubparsersよりも入力のフラグを立て/ optionalsスタイルを使用したい場合は、私は以下のことをお勧めしたい:

import argparse 

def add(x,y): 
    print x+y 

def square(a): 
    print a**2 

parser = argparse.ArgumentParser() 
parser.add_argument('--hello') 
parser.add_argument('-a', '--add', nargs=2, type=int) 
parser.add_argument('-s', '--square', type=int) 

args = parser.parse_args() 
print(args)   # good debugging tool 

if args.add is not None: 
    add(*args.add) # * expands the list into the 2 arguments 
if args.square is not None: 
    square(args.square) 
if args.hello is not None: 
    print ("hello "+args.hello) 

1014:~/mypy$ python stack43776406.py -a 10 11 
Namespace(add=[10, 11], hello=None, square=None) 
21 
1014:~/mypy$ python stack43776406.py --hello world -a 1 2 -s 1000 
Namespace(add=[1, 2], hello='world', square=1000) 
3 
1000000 
hello world 

を生成する場合は、 '-a' フラグ既にaddを意味するので、余分な文字列を含める必要はありません。また、サブパーザーに必要な別々の 'x'、 'y'引数の代わりにnargs=2を使用しました。

is Noneまたはis not Noneは、フラグが設定されているかどうかをテストする便利な方法です。ユーザーはNoneを入力することはできません。したがって、このデフォルトのデフォルト値をテストするのは簡単です。

1014:~/mypy$ python stack43776406.py --help 
usage: stack43776406.py [-h] [--hello HELLO] [-a ADD ADD] [-s SQUARE] 

optional arguments: 
    -h, --help   show this help message and exit 
    --hello HELLO 
    -a ADD ADD, --add ADD ADD 
    -s SQUARE, --square SQUARE 
0
import argparse 

def add(x,y): 
    print x+y 

def square(a): 
    print a**2 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='This is a parser.') 
    parser.add_argument('command', help='The command to execute (add or square).') 
    parser.add_argument('integers', metavar='N', type=int, nargs='+', help='The arguments to the command.') 
    args = parser.parse_args() 

    if args.command == 'add': 
     add(*args.integers) 
    elif args.command == 'square': 
     square(*args.integers) 
    else: 
     print 'Command not supported.' 

出力:https://docs.python.org/3/library/argparse.html#sub-commands

$ python hello.py add 2 3 
5 
$ python hello.py square 2 
4 
関連する問題