はじめに
移植やってます。
デコレーター (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 の デコレーター を学習した
- 道のりは遠そう