2016-04-22 3 views
3

すべてを実行するためのメインファイルは、十数個の変数(トップレベルの制御フローではデフォルトでグローバル)、いくつかの構造体、中間サイズの大きなメインループ。他の言語から、私はグローバルが悪いことを学んだ。私は、次のようなグローバルな制御フローから、同じファイル内のクラスにそれをすべて入れて、ちょうど1つのメソッドを呼び出すする傾向がある:pythonでプログラムエントリポイントを設計する

def MyClass: 
    def __init__(self): 
    self.value1 = 1 
    .... 

if __name__ == "__main__": 
    #inspect sys.argv here 
    MyClass().main_proc() 

あなたはそれデザインプラス考えるだろうか?これを行うためのpythonic方法はありますか?

+0

私はhttps://programmers.stackexchange.com/で尋ねることをお勧めしますが、一般的に、私はその技術に関する特定の問題を知らない。 – cxw

+2

Pythonは、あなたのようなOOPを使用するよう強制しません。 JavaやC#を使っているので、実際のメリットがない場合はクラスに入れる必要はありません。特にグループ化するだけのクラスインスタンスを作成することは、IMHOに行く最良の方法ではありません。代わりにモジュールにそのようなものを抽出することができます。これはインスタンスを必要とせず、インポートするだけです。そうすれば、それは分離されたファイルと名前空間にもあります。 –

+1

また、 'if __name__ ...'行のインデントが間違っています。外側のレベルでなければなりません。おそらくタイプミスでしょうか? –

答えて

2

Pythonでは、OOPを使用するよう強制されません。 JavaやC#を使っているので、実際のメリットがない場合はクラスに入れる必要はありません。

IMHOに行くには、特にクラスのインスタンスをグループ化するだけでは最適な方法ではありません。代わりにそのものをモジュールに抽出することができます。これはインスタンスを必要とせず、インポートするだけです。そうすれば、それは分離されたファイルと名前空間にもあります。

例:

main.py

if __name__ == "__main__": 
    import sys 
    args = sys.argv[1:] 
    if len(args) != 2: 
     print("This script requires exactly two command-line arguments!") 
     exit(1) 

    import my_module 
    exit_code = my_module.run(args) or 0 
    exit(exit_code) 
else: 
    raise ImportError("Run this file directly, don't import it!") 

my_module.py

# initialization code to be run at import time goes here 

def run(args): 
    # do whatever you need to do 
    print("Hello world!") 
    print("You said <", args[0], "> and <", args[1], ">." 

    # you may return an integer (1-255) as exit code if an error occurred, 
    # else the default exit code is 0 (successful; no error) 

しかし、は究極の真実として、このアプローチを取ることはありません!それは私の個人的な意見ではありませんが、あるアプローチが適している状況と、他のアプローチが適している状況が常にあります。

また、これは主に設計に関する質問であり、プログラムの安定性や機能性には実質的な影響はありません。それは読みやすさを向上させるだけかもしれませんが、特に小さなスクリプトの場合、本当に何もしない多くのコードを追加するので、良いアプローチではありません。これは、いくつかのモジュールを持つ大きなプロジェクトがある場合にのみ役に立ちます。

ほんの小さなスクリプト(単一ファイルまたはごく少数のモジュール)の場合、必要なすべてのクラスと関数を上に定義し、標準if __name__ == "__main__"をエントリポイントとして使用することをお勧めします。

+0

ご清聴ありがとうございます。懸念事項は、主にグループ化ではなく、アクセスに関するものです。あなたのお勧めはさらに誤用を招く可能性があります。つまり、別のモジュールが最終的に誰かによってインポートされる可能性があります。最悪の場合、グローバルを介して微妙ではありますが有害な相互作用が生じる可能性があります。 C++の後では、モジュール全体の変数を持つように感じるので、どのモジュールのユーザーにもアクセスできるのは安全ではありません。しかしおそらく私は間違っていて、ここでは事情が異なる。 – VladimirLenin

+1

さて、Pythonでは実際のアクセス保護はまったくありません。特定のプロパティを使用しないように他のプログラマーに指示するのは、単一のアンダースコアで名前を始めるだけです。 '_internal_variable'です。ダブルアンダースコア(二重アンダースコアで終わるマジックメソッドを除く)で名前を開始すると、プロパティは "private"になりますが、実際にはPythonは名前のマングリングを実行し、その前にモジュールを追加することによって名前を変更します。また、Pythonの優れたイントロスペクション機能によって、探しているものが分かっていれば実際にすべてのプロパティを取得できます。 –

関連する問題