Cách decorator với hàm decorator có 2 tham số?


em chào mọi người, với decorator mà hàm decorator split_string() có 2 tham số, thì em phải làm như nào mới decorator được?
em có viết thêm hàm function2, rồi thêm marker ở đầu như hàm function1, nhưng lỗi.
thanks

def split_string(function1, function2):
        func1 = function1()
        func2 = function2()
        return func1+func2
@split_string
def function1():
    return 'hello there'
print(function1)

Lưu ý decorator phải trả về hàm chứ ko phải là kết quả đâu.

Cú pháp gọi decorator với tham số:

@decorator(f1)
def f2():
   pass
3 Likes

vậy bạn ko hiểu bản chất, decorator ko nhất phải trả về hàm, e test rồi nhé, ví dụ @property cho getter và setter cũng ko cần phải trả về hàm

còn cái mình hỏi, liệu bạn có đọc kỹ và hiểu mình hỏi gì ko?

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

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?