2016-08-09 10 views
8

だから私は、私は、Python 2.7のドキュメントに基づいて作成されたことをPythonで簡単なカスタムエラークラスを持っている:Pythonのカスタムエラークラスでsuperを呼び出すポイントは何ですか?

class InvalidTeamError(Exception): 
    def __init__(self, message='This user belongs to a different team'): 
     self.message = message 

これはので、私はそれを見に行くとの非常に有用な説明を与えています私はPyLintでW0231: __init__ method from base class %r is not calledを警告できます"説明が必要"私は通常、このエラーを無視したいと思いますが、私はトンのコードは、最初の質問のカスタムエラークラスのメソッドの最初にスーパーへの呼び出しが含まれて気づいた:これは実際に目的を果たすか、それは偽のパイリントの警告を和らげようとしている人だけ?

答えて

10

これは有効なパイリントの警告でした。つまり、スーパークラス__init__を使用しないと、親クラスの実装変更を見逃す可能性があります。実際には、BaseException.messageはPython 2.6以降で廃止されています。

ここでは、警告W0231を回避し、message属性に関するPythonの非推奨の警告を回避する実装となります。

class InvalidTeamError(Exception): 
    def __init__(self, message='This user belongs to a different team'): 
     super(InvalidTeamError, self).__init__(message) 

これはimplementation for BaseException.__str__のみ「引数」タプルを考慮するため、それがすべてのメッセージを見ていない、それを行うには良い方法です。あなたの古い実装では、print InvalidTeamError()は空の文字列しか表示しませんでした。これはおそらくあなたが望むものではありません!

+0

Cの実装にリンクするための巨大なサムスアップ。それはすぐに明らかになる、何が起こっている! – timmwagener

-1

cpython2.7ソースコードでLookinvスーパーへの呼び出しを避けるために問題はありませんとはい、あなたのinitで基本クラスinitを呼び出すのが一般的に良い習慣であるからです。

https://github.com/python/cpython/blob/master/Objects/exceptions.c BaseExceptionのinitと行45の行を参照してください。ExceptionはBaseExceptionからどのように派生していますか。

関連する問題