2016-09-01 3 views
0

ラズベリーパイを取得しました。PRAWライブラリを使用して、Reddit APIベースのアプリケーションを構築しています。私が使用して私のpythonファイルを実行しています。しかしコマンドラインオプションの設定を繰り返し参照するときにコードDRYを保持する

sudo python3 main.py 

、私は、コマンドライン(私はそれたとえば、引数silentを渡すことで、黙ってアプリケーションを実行することができます)からこのファイルに引数を渡すしたいと思い、私はsys.argv[0], sys.argv[1], etc..でそうすることができることを知っています。

私の問題は、DRY - これらのオプションによって確立された設定を参照して自分自身を繰り返さないでください。

def init(): 
if (len(sys.argv) >= 1): 
    global semisilent 
    global silent 
    for arg in sys.argv: 
     if arg == "semisilent": 
      semisilent = True 
     if arg == "silent": 
      silent = True 

print ("--------[ Reddipi v0.1 ]--------\n") 

if silent: 
    print (" ++Running in silent mode++ \n") 
elif semisilent: 
    print ("++Running in semi-silent mode++ \n") 
else: 
    print ("  Logging in to reddit  ") 
    print ("    ....    ") 
global r 
r = oauth.login() 

if not silent: 
    print ("  Login successful  \n") 

if not silent and not semisilent: 
    print ("  Connecting to database  ") 
    print ("    ....    ") 
db.init(tablename) 
if not silent: 
    print ("  Connection successful  \n") 

if not silent and not semisilent: 
    global sub_name 
    q_sub = input("  Use custom subreddit?  \n") 
    if (q_sub[0]=="y"): 
     q_sub = input("  Enter custom subreddit: \n") 
     if ((len(q_sub)==0) or (q_sub==" ")): 
      print (" No valid input. Using default \"" + sub_name + "\" \n") 
     else: 
      sub_name = q_sub 
      print ("\r Using subreddit \"" + sub_name + "\"\n") 
    else: 
     print ("  Using default \"" + sub_name + "\" \n") 

私は自分自身は常にコードの他の部分の前にif not silentと、このようなを置くことによって非常に読みにくいコードを作る見つける:

この

は、私のコードの一部です。私は同じ基本機能を持つ複数のメソッドを持つことについても考えましたが、ユーザーが silentまたは semisilentを入力した場合はコードが残っていますが、これは不要なコードの重複につながります。

私のメソッドの動作を変更したり、コードを複数回書き直さなくても良い方法がありますか?

ありがとうございました! - Jeroen

+1

あなたは 'logging'と同じような意味ですか? –

+0

...これが異なるコンテキストであっても、ロギングモジュールの設計上の決定(つまり、必要な共有状態を参照する責任を負うヘルパ関数で繰り返し条件付きロジックをカプセル化する)が適切です。 –

答えて

1

変数(サイレント)が設定されているかどうかを確認し、その値が設定されている場合は印刷することをスキップする、独自のカスタム "印刷"方法を定義します。だからあなたのすべての行のprint( 'value')はmyprint( 'value')のようになります。私は個人的には、関数名verbose()とdebug()を使い、2つのログレベルを持つのが好きです。あなたの場合、おそらくそれらを「静かな」()と「半」()というものと呼んでください。

+0

Spot-on re:質問に答える。 (私は[標準ライブラリ 'logging'モジュール](https://docs.python.org/2/library/logging.html)を使用することを推奨する傾向があります。繰り返しロジックをカプセル化する一般的なケースについては、これが正しいアプローチです)。 –

+1

ありがとうございます!これはまさに私が探していたものです。なぜ私は自分自身を考えなかったのか分かりません。そこに加えて@CharlesDuffyにも感謝します。私は未来の伐採を見ていきますが、これは今のところうまくいくようです。 –

関連する問題