はじめに
移植やってます。
デコレーター (Python)
# ----------
# Name: hoge
# Args: (15, 37)
# Kwargs: {'m': 'ほげ', 'n': 'ぴよ'}
# ----------
# hoge: 15-37/ほげ-ぴよ
独習Pythonのデコレーターを利用しない例を写経してみます。
どうする? (Ruby)
def log_func(func)
  def inner(*args, **kwargs)
    puts "----------"
    puts "Name: #{__method__}"
    puts "Args: #{args}" if args.nil?.!
    puts "Kwargs: #{kwargs}" if kwargs.nil?.!
    puts "----------"
    func.call(args, kwargs)
  end
  inner
end
def hoge(x, y, m: 'bar', n: 'piyo')
  puts "hoge: #{x}-#{y}/#{m}-#{n}"
end
log_hoge = log_func(method(:hoge))
log_hoge(15, 37, m: 'ほげ', n: 'ぴよ')
# ----------
# Name: inner
# Args: []
# Kwargs: {}
# ----------
# in `inner': undefined local variable or method `func' for main:Object (NameError)
本の内容に近いコード。
エラーが出ています。
def log_func(func, *args, **kwargs)
  def inner(func, *args, **kwargs)
    puts "----------"
    puts "Name: #{__method__}"
    puts "Args: #{args}" if args.nil?.!
    puts "Kwargs: #{kwargs}" if kwargs.nil?.!
    puts "----------"
    func.call(args, kwargs)
  end
  inner(func, args, kwargs)
end
def hoge(x, y, m: 'bar', n: 'piyo')
  puts "hoge: #{x}-#{y}/#{m}-#{n}"
end
log_hoge = log_func(method(:hoge), 15, 37, m: 'ほげ', n: 'ぴよ')
# ----------
# Name: inner
# Args: [[15, 37]]
# Kwargs: {:m=>"ほげ", :n=>"ぴよ"}
# ----------
# hoge: [[15, 37]]-{:m=>"ほげ", :n=>"ぴよ"}/bar-piyo
引数の受け渡しが不味そう。
hogeの出力が正しくない。
def log_func(func, *args, **kwargs)
  inner = proc {
    puts "----------"
    puts "Name: #{__method__}"
    puts "Args: #{args}" if args.nil?.!
    puts "Kwargs: #{kwargs}" if kwargs.nil?.!
    puts "----------"
    func.call(*args, **kwargs)
  }
  inner.call
end
def hoge(x, y, m: 'bar', n: 'piyo')
  puts "hoge: #{x}-#{y}/#{m}-#{n}"
end
log_hoge = log_func(method(:hoge), 15, 37, m: 'ほげ', n: 'ぴよ')
# ----------
# Name: log_func
# Args: [15, 37]
# Kwargs: {:m=>"ほげ", :n=>"ぴよ"}
# ----------
# hoge: 15-37/ほげ-ぴよ
procでやってみた。
出力はよさそう。
メソッド名はもちろん異なっています。
メモ
- Python の デコレーター を学習した
 - 道のりは遠そう