2017-05-05 6 views
3

私はファイルをコピーするのに2つの方法があります。どれが最もpython/bestバージョンですか?ファイルをコピーするときにtry/exceptまたはif/elseを使用する

オブジェクト指向の教科書を通して、「例外的な状況」が発生したときにそれをチェックして処理することを避けることが最善であると言われました(ここで言い換えれば)。 2番目のバージョンに有効なtry/exceptが有効ですか?

if/elseを使用して、第1のバージョン:間違い

try: 
    shutil.copy(self.back_zipfile_name, dest) 
except FileNotFoundError: 
    print("{!r} could not be found".format(dest)) 
+1

セカンド。最初に競合状態があります。 –

答えて

2

秒:

if os.path.exists(dest): 
    print("\nCopying zipfile to {}".format(dest)) 
    shutil.copy(self.backup_zipfile_name, dest) 
else: 
    print("Cannot find {}.".format(dest)) 

try/exceptを使用してバージョン。

あなたのプログラムステップは、間に何も起こらないシーケンシャルアクションと考えるのは簡単です。しかし、それは実際にコンピュータ(少なくとも現代の非埋め込み型コンピュータ)がどのように機能するかではありません。

パスが存在することを確認して実際にそれに書き込もうとしている間に、他のプログラムが簡単に出てそれを削除して、キャッチされないランタイム例外につながる可能性があります。これは一般的な並行性のバグです。

完全に制御していないファイルシステム、ネットワーク、その他の外部リソースを扱う場合は、常にtry/catch(またはPythonの場合はtry/except)を使用してください。

Hereは、より詳細な説明を含む優れたリソースです。

2

編集: @Jared Smithsの応答は、その特定のユースケース(ファイルシステムにアクセスする)に適していると思います。


誰もが言ったようにそれはあなた次第ですが、ここではあなたの参照のためのpythonの文書で言うことです。あなたが飛躍する前に

LBYL

ルック。このコーディングスタイルは、呼び出しやルックアップを行う前に事前条件を明示的にテストします。このスタイルはEAFPのアプローチと対照的であり、多くのif文が存在することが特徴です。

マルチスレッド環境では、LBYLのアプローチは、 "見た目"と "飛び跳ねる"の間に競合条件を導入する危険性があります。たとえば、マッピングのキー:return mapping [key]は、テストの後、ルックアップの前に別のスレッドがマッピングからキーを削除した場合に失敗する可能性があります。この問題は、ロックまたはEAFPアプローチを使用して解決できます。

EAFP

許可よりも許しを求めることが容易。この共通のPythonコーディングスタイルは、有効なキーまたは属性の存在を前提としており、仮説が誤っている場合は例外をキャッチします。このクリーンで速いスタイルは、多くの試行錯誤の存在が特徴です。このテクニックは、Cなどの他の多くの言語に共通するLBYLスタイルと対照的です。

https://docs.python.org/2/glossary.html

+2

競合状態は、マルチスレッドを必要としないことに注意してください。他のプログラムは、シングルスレッドシーケンシャルコードの途中でファイルシステムを操作できます。または、運転手がクラッシュする可能性があります。あるいは、他の半ダースのことのどれかが間違っている可能性があります。 –

+0

@ JaredSmithの場合、 'if os.path.exists(dest)'をチェックします。しかし、このチャンスは、2行のコード実行の間だけです。 – itzMEonTV

+2

@ L_Sそれで十分です。これらの2つのステップの間に何回CPUサイクルが発生しますか? Pythonインタープリタは、あなたのコードをコンピュータの実行言語に変換します。OSスケジューラ(各プラットフォームごとに)が実行するCPU時間をどのように変化させるのかを知っていますか?私を信じて、何かが間違ってしまう時間は十分です。これは、すべての言語で(Pythonだけでなく)共通のアンチパターンです。 –

関連する問題