Lỗi vì bạn không đọc kĩ cú pháp của python đó bạn. Bản chất của cú pháp decoration @ là 1 syntactic sugar cho việc call các function lồng nhau.
Ví dụ:
def decor(fn):
return fn()
@decor
def func():
return 'hello'
# cách viết trên tương đương với
def decor(fn):
return fn()
def func():
return 'hello'
func = decor(func)
Trong TH bạn muốn có tham số có sẵn cho hàm decor thì sao? Bạn cần phải call khi khai báo cú pháp decor @
def decor(name):
def wrapped(fn):
return fn() + name
return wrapped
@decor(' world')
def func():
return 'hello'
# Cách viết trên tương đương với
def decor(name):
def wrapped(fn):
return fn() + name
return wrapped
def func():
return 'hello'
func = decor(' world')(func)
Từ các mẫu translate trên bạn có thể tự nghĩ ra nhiều kiểu decoration dị khác nữa
Về lí do tại sao bạn @rogp10 lại nói decor function cần trả về function là vì decor function dùng để wrap function gốc nhằm mục đích thêm hoặc thay đổi hành vi của function gốc.
Như ví dụ 1 của mình, decor function không trả về 1 hàm mà trả về giá trị luôn, điều này sẽ gây confuse cực lớn vì nó sẽ biến function được decor thành value thay vì là 1 function như bình thường. Rõ ràng nó không clean code và cần phải tránh