2017-09-05 20 views
0

私は引数の解析関数がよりクリーンな設計のために分離されているスクリプトを持っています。最終的には、私は単一のコマンドを実行し、それらの3つの関数ですべての引数を解析したいと考えています。すべての引数が認識されるようにするための第1引数解析機能によって無視余分な引数が第二引数に渡されますように、私は、スクリプトを設定しているためにArgumentParserを介して余分な引数を渡す

python3 rhize_refactored.py -l <str>, -sa, [-cr], -si <int>, -i <input_path>, -o <output_path>, [-r], [-c]

:コマンドは次のようになります。もう一度第3引数の解析関数を使用します。その部分は次のようになります。

#Argument parsing functions# 
def parse_args_language(): 
    parser=ArgumentParser(prog= 'rhize.py') 
    parser.add_argument('-l', dest='language', choices= ['bash', 'python'], type=str, default='bash') #required 

    args, extras1= parser.parse_known_args() #pass extras down to parse_args_bash() 
    return args 
    return extras1 

def parse_args_bash(extras1): 
    parser=ArgumentParser() 
    parser=parser.add_argument('-sa', action='store_true') #required 
    parser=parser.add_argument('-cr', action='store_true') #optional 
    parser=parser.add_argument('-si', type=int) #required 
    parser=parser.add_argument('-i') #required 
    parser=parser.add_argument('-o') #required 

    args=parser.parse_args(argv =extras1) 
    extras2= parser.parse_known_args() #pass extras down to parse_args_repo 
    return args 
    return extras2 

def parse_args_repo(extras2): 
    parser= ArgumentParser() 
    parser.add_argument('-r', action= 'store_true') #optional 
    parser.add_argument('-c', action= 'store_true') #optional 

    args=parser.parser_args(argv=extras2) 
    return args 

    ############################################################## 

def rhize_bash(): 
    args, extras1= parse_args_language() 
    parse_args_bash(extras1) 
    make_templates() 
    .... 

def make_templates(): 
    args, extras2= parse_args_bash() 
    parse_args_repo(extras2) 
    ... 

def main(): 
    language= parse_args_language() 
    if language == "bash": 
     rhize_bash() 
    if language == "python": 
     rhize_python() #omitted from this post 

    print("Completed the run.") 
main() 

これを正しい方法で設定しましたか?完全なスクリプトを実行しようとすると、それは完全に実行されているように見えるので、私はそれをすべきではないと知っています。

+0

あなたは、これらの3つの関数を呼び出すコードを残しましたが、私はそれが何かを推測することができます。 'それを完全に実行する'ことは、それがすべて3を呼び出すことを意味するのでしょうか?あなたが 'extras'リストのどれかが空であるかどうかをチェックしない限り、これは完全に正常です。 – hpaulj

+0

はい、申し訳ありません。コードの残りの部分は非常に長くて複雑なので、ここにすべて掲載したくありません。しかし、はい、私はmain()セクションの最後にprintステートメントを持っていて、それが完全に実行されたかどうか(それらの3つの関数を呼び出すことを含む)、コマンドラインにいくつの引数が含まれていてもそれを表示します。そうではないはずです。 – claudiadast

+0

あなたは完全なコードを与える必要はありませんが、関数自体は、呼び出される方法や呼び出す方法を決める方法については何も教えてくれません。実際には、関数には何か重要なものがありません - return文(またはargsとextras)。 – hpaulj

答えて

0

コードフローを正しく作成しようとしています。私はそれをテストしていない。

#Argument parsing functions# 
def parse_args_language(): 
    parser=ArgumentParser(prog= 'rhize.py') 
    parser.add_argument('-l', dest='language', choices= ['bash', 'python'], default='bash') 

    args, extras1 = parser.parse_known_args() #pass extras down to parse_args_bash() 
    return args, extras1 # return a tuple of items 


def parse_args_bash(extras1): 
    parser=ArgumentParser() 
    parser=parser.add_argument('--sa', action='store_true') 
    # store_true actions are always optional 
    parser=parser.add_argument('--cr', action='store_true') 
    parser=parser.add_argument('--si', type=int) 
    parser=parser.add_argument('-i') 
    parser=parser.add_argument('-o') 

    args, extras2= parser.parse_known_args() #pass extras down to parse_args_repo 
    return args, extras2 


def parse_args_repo(extras2): 
    parser= ArgumentParser() 
    parser.add_argument('-r', action= 'store_true') 
    parser.add_argument('-c', action= 'store_true') 

    args=parser.parser_args(argv=extras2) 
    return args 

    ############################################################## 

def rhize_bash(extras1): 
    args1, extras2 = parse_args_bash(extras1) 
    make_templates(extras2) 
    .... 

def make_templates(extras2): 
    args2 = parse_args_repo(extras2) 
    ... 

def main(): 
    args, extras1 = parse_args_language() 
    if args.language == "bash": 
     rhize_bash(extras1) 
    elif args.language == "python": 
     rhize_python(extras1) #omitted from this post 

    print("Completed the run.") 

if __name__ == "__main__": 
    main() 

parse_args_bashparse_args_repoリターンargs名前空間のオブジェクトを分離。 argsparse_args_repoに渡して、それにその値を追加することができます。しかし、私は今そのステップをスキップします。

あなたのコードはと呼ばれ、args.languageの値を取得するために1回、extras1に渡すために1回です。それを行うことに害はないが、それを一度呼び出されるように書き直す。

それはparse_known_argsを使用しているので、それだけで-l引数を無視するであろうから、parse_args_bashは、デフォルトsys.argvを使用して動作するはずです。しかし、それを取り除くextrasで作業することもOKです。

関連する問題