1

最近、いくつかの関数で次のイディオムを使用していることに気付きました。

[...]
def validate(self):
    # Possibly do something "expensive" to calculate whether data is valid or not
    if data_is_valid:
        return ObjectOfSomeSort(validated_data)
    return False

ret = self.validate()
if ret:
    return ret
[...]

構文は少し扱いに​​くく、Python的ではないように感じret = ...; if ret: return retますが、常に次のようなことができるとは限りません。

if self.validate():
    return self.validate()

時々私の検証関数にはかなり計算コストのかかるロジックが含まれているからです。

つまり、StackOverflow、この種の問題にはどのようなPythonイディオムが存在するのでしょうか。具体的には、他にどのように「条件付きで戻る」ことができますか?

4

4 に答える 4

2

Pythonの慣用句は、例外を使用することです。

   class InvalidDataError(Exception):
       pass

   def get_valid_object():
       if not data_is_valid:
           raise InvalidDataError()
       return ObjectOfSomeSort(validated_data)

そしてそれを使用するには:

 try:
     valid_object = get_valid_object()
 except InvalidDataError:
     ... handle error
于 2013-02-08T15:40:39.347 に答える
1

あなたができる

def ifloop(x):
    if x: yield x

for ret in ifloop(self.validate()):
     return ret
于 2013-02-08T15:36:43.260 に答える
0

コードを続行する必要がない場合は、次のifように記述します。

return self.validate() or None
于 2013-02-08T15:44:33.297 に答える
0

NULL object patternを使用できます。次のメソッドを追加して、そのインスタンスも False と見なされるようにしてください。これにより、テストが容易になります。

def __nonzero__(self) :
    return False

このようなオブジェクトの有用性はNull、他のほとんどのオブジェクトと同じように使用できることです。そのため、多くの場合、他のタイプの有効なオブジェクトを持っていると想定できるコードの残りの部分でそれらをチェックする必要はありません。

このパターンについて初めて聞いたのは、Alex Martelli によるPython Cookbookの第 2 版でした。レシピ6.17です

于 2013-02-08T17:23:42.650 に答える