Pythonで例外・エラーのクラス階層を出力する方法
Pythonの例外(Exception)やエラー(Error)のクラス階層を出力するには、標準ライブラリのinspectモジュールをインポートし、getclasstree()関数を使用します。
このコードでは、指定した例外クラスのリストを、ネストされたリストによる階層構造へと整理して出力します。__subclasses__()メソッドを再帰的にたどることで、出力例のように継承ツリーを下りながらすべてのクラス名をインデント付きで表示していきます。
仕組みのポイント
- inspect.getmro(BaseException):
BaseExceptionとその祖先クラス(objectなど)をタプルとして取得します。 - inspect.getclasstree():取得したクラス群を、継承関係を表すネストされたリスト構造に変換します。
- cls.__subclasses__():各クラスの直接のサブクラスを返すため、これを再帰的に呼び出せばツリー全体を走査できます。
コード例
import inspect
print "The class hierarchy for built-in exceptions is:"
inspect.getclasstree(inspect.getmro(BaseException))
def classtree(cls, indent=0):
print '.' * indent, cls.__name__
for subcls in cls.__subclasses__():
classtree(subcls, indent + 3)
classtree(BaseException)
出力
このコードを実行すると、次のような出力が得られます。
The class hierarchy for built-in exceptions is: BaseException ... Exception ...... StandardError ......... TypeError ......... ImportError ............ ZipImportError ......... EnvironmentError ............ IOError ............ OSError ............... WindowsError ......... EOFError ......... RuntimeError ............ NotImplementedError ......... NameError ............ UnboundLocalError ......... AttributeError ......... SyntaxError ............ IndentationError ............... TabError ......... LookupError ............ IndexError ............ KeyError ............ CodecRegistryError ......... ValueError ............ UnicodeError ............... UnicodeEncodeError ............... UnicodeDecodeError ............... UnicodeTranslateError ......... AssertionError ......... ArithmeticError ............ FloatingPointError ............ OverflowError ............ ZeroDivisionError ......... SystemError ............ CodecRegistryError ......... ReferenceError ......... MemoryError ......... BufferError ...... StopIteration ...... Warning ......... UserWarning ......... DeprecationWarning ......... PendingDeprecationWarning ......... SyntaxWarning ......... RuntimeWarning ......... FutureWarning ......... ImportWarning ......... UnicodeWarning ......... BytesWarning ...... _OptionError ...... error ...... Error ...... TokenError ...... StopTokenizing ...... error ...... EndOfBlock ... GeneratorExit ... SystemExit ... KeyboardInterrupt
補足:Python 3で実行する場合
上記のコードと出力はPython 2ベースのものです。Python 3ではprintが関数として扱われるため、print('.' * indent, cls.__name__)のように括弧を付けて記述します。また、Python 3ではStandardErrorが廃止されるなど例外階層にも変更があるため、実際の出力内容は上記とは異なる点に注意してください。
-
Pythonで文字「G」のパターンを出力するプログラム
コンソールにアスタリスク(*)を使って文字「G」のパターンを表示したい場合、専用の関数を定義し、二重ループ(ネストされたループ)で行と列を走査しながら、条件に合致する位置だけ「*」を出力する方法が有効です。以下に実際の実装例を示します。サンプルコードdef display_pattern(my_line): my_pattern = for i in range(my_line): for j in range(my_line): if ((j == 1 and i != 0 and i != my_line - 1)
-
Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例
Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実