Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのinspectモジュールでライブオブジェクトを検査する方法

inspectモジュールとは

Pythonの標準ライブラリ「inspect」モジュールには、モジュール、クラス、メソッド、関数、コードオブジェクトなど、実行中のオブジェクト(ライブオブジェクト)に関する有用な情報を取得するための関数が多数用意されています。これらの関数を活用することで、型チェック、ソースコードの取得、クラスや関数の検査、インタプリタスタックの調査などが可能になります。

主な関数

getmembers() – オブジェクトのすべてのメンバーを、名前と値のペアからなるリストとして返します。リストは名前順にソートされます。オプションで述語(predicate)を指定すると、述語が真を返すメンバーのみが結果に含まれます。

getmodulename() – ファイルパスからモジュール名を返します。このとき、外側のパッケージ名は含まれません。

サンプルスクリプト

以下のスクリプトを使用して、inspectモジュールの動作を確認していきます。

#inspect-example.py
'''これはモジュールのdocstringです'''
def hello():
   '''helloのdocstring'''
   print ('Hello world')
   return
#クラス定義
class parent:
   '''parentのdocstring'''
   def __init__(self):
      self.var='hello'
   def hello(self):
      print (self.var)
class child(parent):
   def hello(self):
      '''hello関数をオーバーライド'''
      super().hello()
      print ("How are you?")

「__」で始まる特殊な属性を除外してメンバーを表示する例です。

>>> import inspect, inspect_example
>>> for k,v in inspect.getmembers(inspect_example):
      if k.startswith('__')==False:print (k,v)
child
hello
parent
>>>

述語(Predicates)

述語とは、inspectモジュールの関数に適用される論理条件のことです。たとえばgetmembers()関数では、指定した述語条件が真となるメンバーだけをリストとして取得できます。inspectモジュールには、以下の述語が定義されています。

ismodule()オブジェクトがモジュールであればTrueを返す
isclass()オブジェクトがクラス(組み込みクラス、Pythonコードで定義されたクラスのいずれか)であればTrueを返す
ismethod()オブジェクトがPythonで記述されたバウンドメソッドであればTrueを返す
isfunction()オブジェクトがPythonの関数(lambda式で生成された関数を含む)であればTrueを返す
isgenerator()オブジェクトがジェネレータであればTrueを返す
iscode()オブジェクトがコードオブジェクトであればTrueを返す
isbuiltin()オブジェクトが組み込み関数またはバウンドされた組み込みメソッドであればTrueを返す
isabstract()オブジェクトが抽象基底クラスであればTrueを返す

次の例では、述語としてinspect.isclassを渡すことで、モジュール内のクラスメンバーのみを取得しています。

>>> for k,v in inspect.getmembers(inspect_example, inspect.isclass):
      print (k,v)
child <class 'inspect_example.child'>
parent <class 'inspect_example.parent'>
>>>

特定のクラス「child」のメンバーを取得したい場合は、次のように記述します。

>>> inspect.getmembers(inspect_example.child)
>>> x=inspect_example.child()
>>> inspect.getmembers(x)

getdoc()関数でdocstringを取得する

getdoc()関数を使うと、モジュール、クラス、または関数に定義されたdocstringを取得できます。

>>> inspect.getdoc(inspect_example)
'This is module docstring'
>>> inspect.getdoc(inspect_example.parent)
'parent docstring'
>>> inspect.getdoc(inspect_example.hello)
'hello docstring'

getsource()関数でソースコードを取得する

getsource()関数は、関数の定義コードそのものを取得します。また、signature()関数を併用すれば、関数のシグネチャ(引数情報)も確認できます。

>>> print (inspect.getsource(inspect_example.hello))
def hello():
    '''hello docstring'''
    print ('Hello world')
    return
>>> sign=inspect.signature(inspect_example.parent.hello)
>>> print (sign)

コマンドラインインターフェース

inspectモジュールは、コマンドラインから直接利用することもできます。-dオプションを付けると、対象モジュールの詳細情報(読み込み元のパス、キャッシュファイル、ローダーなど)が表示されます。

C:\Users\acer>python -m inspect -d inspect_example
Target: inspect_example
Origin: C:\python36\inspect_example.py
Cached: C:\python36\__pycache__\inspect_example.cpython-36.pyc
Loader: <_frozen_importlib_external.SourceFileLoader object at
0x0000029827BD0D30>

さらに、「モジュール名:関数名」の形式で指定すると、該当する関数のソースコードを出力できます。

C:\Users\acer>python -m inspect inspect_example:hello
def hello():
   '''hello docstring'''
   print ('Hello world')
   return
  1. PythonでHello Worldを表示する方法:初心者向けステップバイステップガイド

    Pythonの「Hello World」プログラムは、多くのプログラマーが最初に書くプログラムです。print文を使って文字列をコンソールに表示するだけのシンプルなもので、コードは print(Hello World) の1行のみです。 Pythonが正しくインストールされているかを確認するには、まず「Hello World」を書いてみるのがおすすめです。作成方法は主に2つあります。ターミナル(コマンドライン)を使う方法と、Visual Studio CodeやVimなどのコードエディタを使う方法です。 始める前に、お使いのマシンにPython 3がインストールされていることを確認しておき

  2. Pythonのファイルオブジェクトとは?open関数によるファイル操作の基本を徹底解説

    Pythonでは、ファイルを読み書きする際に特別なライブラリをインポートする必要はありません。ファイル操作は言語にネイティブに組み込まれているためです。 まず最初に行うのは、組み込み関数 open() を使ってファイルオブジェクトを取得することです。open() 関数はファイルを開き、ファイルオブジェクトを返します。このファイルオブジェクトには、開いたファイルから情報を取得したり、内容を操作したりするためのメソッドや属性が含まれています。 ファイルとは何か? ファイル操作を行う前に、「ファイルとは何か」を理解しておきましょう。ファイルとは、関連する情報を保存するためにディスク上に確保された「名