🙌

デコレータは「関数名を引数にできる」ことが分かれば簡単

に公開

関数名の引数

def start_end(f):
  def plus_st_en(x):
    print("----")
    f(x)
    print("----")
  return plus_st_en

def f(x):
  print(x)

x = 987
start_end(f)(x)
#----
#987
#----

同じコードがデコレータを使って簡潔に書ける

def start_end(f):
  def plus_st_en(x):
    print("----")
    f(x)
    print("----")
  return plus_st_en

@start_end
def f(x):
  print(x)

x = 987
f(x)
#----
#987
#----

一番汎用性が高い書き方は?

  1. 変数の数が任意
  2. 返り値が存在
def start_end(f):
  def plus_st_en(*args, **kwargs):
    print("----")
    ans = f(*args, **kwargs)
    print("----")
    return ans
  return plus_st_en

@start_end
def f(x,y,z):
  print(x)
  print(y)
  print(z)
  return x+z

x = 987
y = "uuuu"
z = 7777
print(f(x,y,z))
#----
#987
#uuuu
#7777
#----
#8764  #return

Discussion