3

私は初心者です。ここで学ぶ。

コードの一部が WindowsError をスローしています。私はそれをキャッチし、名前を に変更しexceptionます。

, を通じてオブジェクトをイントロスペクトし、dir(exception)ヘルプ(areference) などのドキュメント コマンドを実行するためのリファレンスを見つけようとしますtype(exception)print(exception.__dict__)

WindowsError が定義された場所が見つかりません。私は試しhelp(os.WindowsError)ましたが、それは明らかにどこにもつながりません。

最終的な目的は、WindowsError の発生元を特定することですが、この質問については、Google から何らかの形で回答を得たので、Python コマンドを使用してこれを見つける方法を学びたいと思います。

具体的には:

  • 型が定義されているモジュールを取得する
  • 例外で取得したクラスのスーパータイプを取得します (または...任意のクラス?!)

私は内省が間違っていますか?それを行うためのより良い方法はありますか?

4

2 に答える 2

2

inspectおそらく、モジュールを見てみたいと思うでしょう。特にinspect.getmodule機能。

クラスの親クラスを取得するには、クラス__bases__属性を確認するだけです。

>>> IOError.__bases__
(<type 'exceptions.EnvironmentError'>,)

__mro__または、次の属性を使用してクラスの階層を取得できます。

>>> IOError.__mro__
(<type 'exceptions.IOError'>, <type 'exceptions.EnvironmentError'>, <type 'exceptions.StandardError'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)

__mro__、Pythonがクラス階層内のメソッドと属性をどの順序で検索するかを示します。

Pythonでは多重継承が許可されているため、「スーパークラス」の概念を定義できないことに注意してください。各クラスは複数の親クラスを持つことができ、階層は非常に複雑なグラフになる可能性があり、スーパークラスを考えようとすると落とし穴が発生するだけです(たとえば、サブクラスが署名を再定義するとメソッドの呼び出しが失敗するなど)。

于 2013-02-21T14:35:48.327 に答える
2

質問 1: 型が定義されているモジュール

私のPythonによると、次の名前の組み込みモジュールで定義されていますexceptions

>>> WindowsError
<type 'exceptions.WindowsError'>

__module__プログラムで、その属性を読み取ることで型が定義されているモジュールを見つけることができます。

>>> WindowsError.__module__
'exceptions'
>>> sys.modules[WindowsError.__module__]
<module 'exceptions' (built-in)>

質問 2: 型のスーパークラスを見つける

型の__bases__属性は、そのスーパークラスをリストします。

>>> WindowsError.__bases__
(<type 'exceptions.OSError'>,)

質問 3: 特定のオブジェクトの型は何ですか

あなたは実際にこの質問をしたわけではありませんが、あなたのコメントは、そうすべきだったことを示しています。オブジェクトのタイプを見つけるには、type()関数を使用します。

>>> i = 666
>>> type(i)
<type 'int'>
>>> type(i).__bases__
(<type 'object'>,)
>>> type(i).__module__
'__builtin__'

したがって、例外をキャッチすると、型ではなくオブジェクト、つまりクラスのインスタンスが得られます。そのため、型について学ぶには、まず型type()を取得するために使用する必要があります。

于 2013-02-21T14:35:13.033 に答える