1. 準備
次のようなモジュール( = pyファイル)を作り、import
しといてください。
未定義.py
class 未定義Error(Exception):
def __init__(self, f): super().__init__(str(f)+"は未定義です。")
class 未定義:
def __init__(self, f): raise 未定義Error(f)
class 未定義メソッド:
def __init__(self, m): self.m = m
def __call__(self, *_, **__): raise Error(self.m)
2. 使い方
2-1. 関数内関数などの場合(オブジェクト指向のメソッドでない場合)
まず、次のように未定義の関数のdef
の上にデコレータ@未定義
をつけます。
from 未定義 import *
def f_out():
@未定義
def f_in():pass
return f_in
そして f_out()
を評価すると、次のようになります。
未定義Error:f_inは未定義です
Traceback (most recent call last):
File "<pyshell#301>", line 1, in <module>
f_out()
File "~~~~.py", line 104, in f_out
def f_in():pass
File "~~~~.py", line 100, in __init__
raise 未定義Error(f)
未定義Error: <function f_out.<locals>.f_in at 0x0000023470EFADC0>は未定義です
2-2. オブジェクト指向のメソッドの場合
まず、次のように未定義のメソッドのdef
の上にデコレータ@未定義メソッド
をつけます。
class Test:
def __init__(self):pass
@未定義メソッド
def mtd(self):pass
そしてTest().mtd()
を評価すると、次のようになります。
未定義Error:Test.mtdは未定義です
Traceback (most recent call last):
File "<pyshell#309>", line 1, in <module>
Test().mtd()
File "~~~~.py", line 101, in __call__
def __call__(self, *args, **kwargs): raise 未定義Error(self.m)
未定義Error: <function Test.mtd at 0x0000021AD5D3AF70>は未定義です
補足: クラスではメソッドを作ると、明示的にクラスあるいはそのオブジェクト.メソッド(*)
を呼ばずとも、処理系によって一度そのメソッドが実行されます。
そのため、@未定義メソッド
のところを単に@未定義
に置き換えると、未定義なメソッドが存在する時点で、例えクラスが一度も呼ばれたり、オブジェクトが生成されなくても未定義Error
を返すようになります。