2017-01-10 4 views
4

私はテスト名を見つけ、当社で広く使用されているスクリプトを持っています。それはそうのようなコマンドラインで動作します。スクリプト内argparseを使用して別のPythonスクリプト内で呼び出し可能にするスクリプトをどのようにリファクタリングしますか?

find_test.py --type <type> --name <testname> 

は相当を示します。

import argparse 

parser = argparse.ArgumentParser(description='Get Test Path') 
parser.add_argument('--type',  dest='TYPE',  type=str,   default=None, help="TYPE [REQUIRED]") 
parser.add_argument('--name',  dest='test_name', type=str,   default=None, help="Test Name (Slow)") 
parser.add_argument('--id',  dest='test_id', type=str,   default=None, help="Test ID (Fast)") 
parser.add_argument('--normalise', dest='normalise', action="store_true", default=False, help="Replace '/' with '.' in Test Name") 
args = parser.parse_args() 

(わからないすべてのこれらの引数は何をすべきか、私は個人的には最初の2つだけを使用します)。これらの行は、これらの引数を使用するコードによって処理されます。

このスクリプトをリファクタリングして、モジュールとしてインポートすることができますが、コマンドライン機能も保持しています。多くの人がこのスクリプトを使用していて、いくつかのcshスクリプトでも呼び出されています。

私はそうのように、これまでのところ、それをリファクタリングしている:

def _main(): 
    <all the former code that was in find_test.py> 

if __name__ == "__main__": 
    _main() 

そして、これはまだコマンドラインから細かい動作します。しかし、私は親スクリプトでどのようにして関連するスイッチを使って引数を渡すのか分かりません。

これをさらにリファクタリングして親スクリプトで呼び出す方法を教えてください。 これは可能ですか?

私が読んだdocoptsは、必要な場合を除いて、新しいargparseを使用しないでください。つまり、会社全体にインストールされていないため、arparousプロシージャになる可能性があります。

答えて

3

すべてのコードを直接関数に移動しないでください。それはまったく役に立たない。

何をすべきかは、何が起こったのかを関数にする必要があるコードを移動することです。 (外部インターフェイスなので、それは_で始まるべきではありません。)コマンドラインから実行する必要のあるコード、つまりパーサの内容は、ブロックののままにしてください。 main()

ので:

def main(TYPE, test_name, test_id=None, normalise=False): 
    # ... body of script... 

if __name__ == "__main__": 
    parser = ... 
    ... 
    args = parser.parse_args() 
    main(**vars(args)) 

(そしてdocoptは新しいものではありません、それは一部の人が好きな外部ライブラリです。)

関連する問題