エラーをエレガントに捉えてメソッドをきれいに保つ方法は?

python

私は、頻繁でエラーが発生しやすい、頻繁に行われる作業を自動化するための、小さな(er)Pythonスクリプトを作成中です。 このスクリプトは、os.systemを通して、またはosを通して(mkdir | chdir | etc)、さまざまなシステムコールを行う責任があります。

これが私のコードの一例です。

クラスAClass:

def __init __(self、foo、bar、verbose = False、silent = False):#各インスタンスに必要な変数を設定します。などsilentの場合self.redirect = '':self.redirect = '> 2>

def a_method(self): ""説明されているようにシステムコールを介して4〜6のことを実行する責任があります

self.verboseでself.silentではない場合:print "ディレクトリの作成"を試してください:OSError以外のos.mkdir( 'foobar') e.strerror)

self.verboseでself.silentではない場合:print "ディレクトリの一覧表示" if(os.system( 'ls foobar%s')%self.redirect)が0以外の場合:OSErrorを発生させる

def b_method(self): "" "a_method()と非常によく似ています" "

def run(self): "" "すべてをステッチ" "します

試してください:OSエラーを除くa_method()、e:print "a_method():%s"

試してください:OSエラーを除くb_method()、e:print "b_method():%s"%e.strerror sys.exit(-1)

明らかにすべての if self.verboseでnot self.silent`を書くのは面倒で、それぞれの呼び出しのまわりの try / catch`や `if`は見にくいです。 私はPythonのロギングクラスを使いたいと思っていて、ただ一つのロギングレベル(冗長)をコマンドラインで設定可能にして、それから簡単に `logger.debug( ‘My message’)`と呼ぶことができる`logging`クラスへのアクセス

*まとめ/基本的な質問*私はPython 2.2を使っていますが、これを変更することはできません。 私はESX 3.0.2サーバー上で実行していますが、当面は他の方法でそれに触れることはできません。 このロジックをクラスに結び付けずにエラーチェックと詳細な出力を処理するための最善の方法は何ですか(One Thingのみを実行する必要があります)。 もっとシンプルでエレガントなもので、クラッタを減らすにはどうすればよいですか

ありがとうございます。

  1  1


ベストアンサー

冗長出力をクリーンアップする方法

冗長/非表示論理を単一の関数に移動してから、すべての出力に対してその関数を呼び出します。 もしあなたがそれを素晴らしくて短いものにするなら、それはあなたのメインラインのコードをかなりきれいにしておく。

def P(s):if(詳細):sを表示します。

私たちの内部コードでこれを行うパッケージがあります、それは以下のメソッドを持っています:

  • * P * – 通常の印刷: P( 'これは関係なく印刷されます、 - quietはそれをシャットダウンしません')

  • * V * – 冗長な印刷:​​ `V( ‘これは—​verbose’の場合のみ印刷されます)

  • * D * – debug print: `D( ‘これは—​debugの場合にのみ表示されます)

4


冗長で黙っていない場合、すべてを書くのは面倒です

そのため、代わりにsys.stdoutをダミークラスに割り当てます。このクラスの書き込みがノーオペレーションまたはサイレントである必要がある場合は、ガードを必要とせずにprintを使用します。 (あまり条件が整っていない場合は、sys.stdoutを実際のものに復元することを忘れないでください – 実際には、2つの関数にカプセル化する方が簡単です)。

エラーチェックの場合、すべてのブロックは次のようになります。

試してください:OSエラーを除くa_method()、e:print "a_method():%s"%e.strerror sys.exit(-1)

のようにすることができます

docall(a_method)

私が望んでいることは、かなり明白な `def docall(acallable):`です。

同様に、他のtry / except caseや、新しい例外が条件付きで発生したものは、適切な引数を持つ関数の呼び出しになる可能性があります。 高階関数) あなたがこれのどの部分があなたにとって難しいか不明確であるかを明確にするならば、私は詳細なコードを加えることがうれしいです!

Python 2.2は、現在は非常に古くなっていましたが、その点では優れた言語でした。MacLispなどの他の古くからある言語と同じように、きちんとそれを使用することが可能です。

4


タイトルとURLをコピーしました