-1

メソッドに関するすべてのロジックを 1 つの場所に含めるために、複数の場所で使用されているメソッドからブール値を返すことがよくあります。(内部) 呼び出しメソッドが知る必要があるのは、操作が成功したかどうかだけです。

私は Python を使用していますが、質問は必ずしもその言語に固有のものではありません。私が考えることができるオプションは2つだけです例外を発生させますが、状況は例外的ではありません.関数が呼び出されるすべての場所でその例外をキャッチすることを忘れないでください私がやっているようにブール値を返します.

これは、私が話していることを示す非常に単純な例です。

import os

class DoSomething(object):

    def remove_file(self, filename):

        try:
            os.remove(filename)
        except OSError:
            return False

        return True

    def process_file(self, filename):

        do_something()

        if remove_file(filename):
            do_something_else()

動作しますが、設計が悪いです。どうすればこれを改善できますか?

4

5 に答える 5

3

あなたがここで解決しようとしていることを理解しているかどうかはわかりませんが、このコメントは理解できるようです:

削除を試みる前に使用できますos.path.exists(filename)が、その間にファイルがロックされていないという保証はなく、削除が成功したかどうかを判断する必要があります。

また、その間にファイルが削除されたり、別のファイルに置き換えられたりしないという保証もありません。したがって、使用しない方が正しいですos.path.exists

しかし、ここで何が問題なのですか?削除してみてください。ファイルが存在しない場合は、例外が発生します。ファイルがロックされているか、削除に失敗した場合は、例外が発生します。いずれにせよ、削除は失敗しました。

問題が 1 つの失敗の理由を他のものと区別して、それを特別に処理できるようにする場合、それは簡単です。

try:
    os.remove(filename)
except FileNotFoundError:
    print("Oops, {} doesn't exist".format(filename))
except OSError as e:
    print('Got {} trying to delete {}'.format(e, filename))
else:
    do_something_else()

3.3 より前のバージョンの Python を使用している場合は、 がないFileNotFoundErrorため、少し美しくありませんが、考え方は同じです。

try:
    os.remove(filename)
except OSError as e:
    if e.errno == errno.ENOENT
        print("Oops, {} doesn't exist".format(filename))
    else:
        print('Got {} trying to delete {}'.format(e, filename))
else:
    do_something_else()
于 2013-05-16T21:02:59.500 に答える
0

「ブール値」を本当に削除したい場合は、次のようなラムダを使用できます

def remove_file(self, filename, success):
    try:
        os.remove(filename)
    except OSError:
        //error stuff
    else:
        success()

def process_file(self, filename):
    do_something()
    remove_filename(filename, lambda: do_something_else())

必要なパラメーターの数を関数に渡してラムダでラップすることができるため、成功関数は塗りつぶしの削除が成功した場合にのみ実行されます。ただし、最初のコードに問題はありません。

于 2013-05-16T21:03:21.687 に答える