Pythonic の方法は、エラー状態にあるにもかかわらず、メソッド呼び出しがクラッシュしないような状態でオブジェクトを放置しないことだと思います。プログラムが最終的に倒れるポイントはバグが発生した場所ではないため、これらは見つけるのが最も難しいバグです。
例えば。
class PseudoTuple(object):
"""
The sum method of PseudoTuple will raise an AttributeError if either x or y have
not been set
"""
def setX(self, x):
self.x = x
def setY(self, y):
self.y = y
def sum(self):
"""
In the documentation it should be made clear that x and y need to have been set
for sum to work properly
"""
return self.x + self.y
class AnotherPseudoTuple(PseudoTuple):
"""
For AnotherPseudoTuple sum will now raise a TypeError if x and y have not been
properly set
"""
def __init__(self, x=None, y=None):
self.x = x
self.y = y
してはいけないことは次のようなものです
class BadPseudoTuple(PseudoTuple):
"""
In BadPseudoTuple -1 is used to indicate an invalid state
"""
def __init__(self, x=-1, y=-1):
self.x = x
self.y = y
def sum(self):
if self.x == -1 or self.y == -1:
raise SomeException("BadPseudoTuple in invalid state")
else:
return self.x + self.y
これは、次のpythonicのモットーに基づいていると思います。
許可を得るより許しを請うほうが簡単だ
例外的な状態が、クラスの誤用によるユーザー エラーではなく、通常の実行過程で発生することが予想されるものである場合は、独自の例外を作成する必要があると思われます。StopIteration と反復子は、この例です。