0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【python3】未定義な関数やメソッドを宣言するデコレータを作ってみた。

Posted at

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を返すようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?