2017-01-25 2 views
2

私はPythonスクリプトを作成しています.3つの位置引数(名前、日付、位置、そう言えば)または1つの引数を取ります。1つまたは3つの位置引数付きのPythonスクリプト

私は​​を使用することができますし、私が持つオプションの位置引数作ることができることを知っている:

parser.add_argument('name_OR_setupFile') 
parser.add_argument('date', nargs='?') 
parser.add_argument('location', nargs='?') 

をしてから、私はエラーチェックすることができ、ユーザーは

愚かな何もしなかったことを確認します

問題は、最初の引数が本当に何であるか不明確であるため、ヘルプメッセージが非常に混乱することです。どういうわけか、2つの異なるadd_argument行としてこれを行う方法が好きですが、どうしたらよいか分かりません。

また、私は--setupFile引数を使用して3つのオプションを作ることができることを知っています...しかし、私はそれをやっていなくてもいいでしょう。

番目のオプションは使用することです:

parser.add_argument('ARGS', nargs='+', help='ARGS is either of the form setupFile, or name date location') 

と明確化のために、エラーチェック後に...

ETA:

私はどちらかとスクリプトを呼び出すことができるようにしたいです:

python foo.py setupFile 

または

python foo.py name date location 

私はヘルプテキストのようなものになりたい:

usage: 
foo.py setupFile 
foo.py name date location 
+0

あなたは何が必要で、より明確にしてくださいことはできますか? add_argument呼び出しでヘルプメッセージを渡すことができますか? –

+1

FWIW、 'usage:foo.py [setupFile] [name date location]'を見れば、私のargs形式の解釈はあなたの記述とは完全に異なります。 – NPE

+0

@NPE:良い点。どのフォーマットが分かりやすいでしょうか? –

答えて

1

ない、これはあなたが何を意味するのかですが、私が正しくあなたを理解している場合、完全に確認してください:

if __name__ =='__main__': 
    def dem_args(*args): 
     if len(args) == 1: 
      if os.path.isfile(args[0]): 
       #go file 
      else: 
       #error regarding this being a bad filename or nonexistent file 
     elif len(args) == 3: 
      #try to process/raise errors regarding name, date, location 
     else: 
      #error reg. wrong number of arguments, possible arguments are either this or that 
3

私は明確なデザインを考えます​​を使用すると、次のとおりです。

parser = argparse.ArgumentParser() 
g = parser.add_mutually_exclusive_group() 
g.add_argument('--setup','-s',metavar='FILE',help='your help') 
g.add_argument('--name',nargs=3,metavar=('NAME','DATE','LOCATION'),hel 
    ...: p='your help') 

parser.print_help()プロduces:

usage: ipython3 [-h] [--setup FILE | --name NAME DATE LOCATION] 

optional arguments: 
    -h, --help   show this help message and exit 
    --setup FILE, -s FILE 
         your help 
    --name NAME DATE LOCATION 
         your help 

私は、相互に排他的optionals1 or 3引数の要件を扱ってきました。そして、引数に明快さを加えるためにmetavarを使用しました。 (別の最近の質問に記載されているように、metavarpositionalsでうまく動作しません)

もう1つのオプションはsubparsersです。それでもsetupnameのようなキーワードが必要な場合は、--なしで入力します。また、サブパーザーのヘルプ構造もかなり異なっています。

+0

ええ、議論は重要です。興味深い、私はグループについて知りませんでした! –

0

これは私が現在行っていることです。私は人々にコメントをするためにここに置いています。

私は実際にここで追加の問題を解決しています。問題は実際には私が指定したものより少し複雑です。実際にプログラムを実行するには3つの方法があるので、--helpオプションを使用して1つのタイプの詳細しかわかりません。ですから、私は-h、-h 1と-h 2のすべてが異なることをしたいと思います。

私の現在のコードは次のとおりです。

import argparse 

baseParser = argparse.ArgumentParser(add_help=False) 
baseParser.add_argument('-f', '--foo', help ='foo argument') 
baseParser.add_argument('-h', '--help', nargs='?' , const = 'all') 

parser1 = argparse.ArgumentParser(parents = [baseParser], add_help=False) 
parser1.add_argument('name', help='name argument (type 1)') 
parser1.add_argument('date', help='date argument') 
parser1.add_argument('location', help='location argument') 

setupParser=argparse.ArgumentParser(parents = [baseParser],add_help=False) 
setupParser.add_argument('setup', help='setup file') 

parser2 = argparse.ArgumentParser(parents = [baseParser],add_help=False) 
parser2.add_argument('name', help='name argument (type 2)') 
parser2.add_argument('baa', help='sheep?') 

realParser = argparse.ArgumentParser(parents=[baseParser], add_help=False) 
realParser.add_argument('ARGS', nargs = '*', help = 'positional arguments') 

args = realParser.parse_args() 
if args.help: 
    if args.help == 'all': 
     print 'This product can be used in multiple ways:' 
     print 'setup' 
     setupParser.print_usage() 
     print 'type1' 
     parser1.print_usage() 
     print'type2' 
     parser2.print_usage() 
     print 'use help [type] for more details' 
    elif args.help=='setup': 
     setupParser.print_help() 
    elif args.help=='1': 
     parser1.print_help() 
    else: 
     parser2.print_help() 
    exit(0) 
    #actually parse the args in args.ARGS, and work with that 
関連する問題