2017-12-04 20 views
6

Tôi đang học cách sử dụng trang trí python.Python: Sửa đổi hành vi bên trong của một hàm bằng cách sử dụng trang trí

def my_dcrtr(fun): 
    def new_fun(): 
     return fun() 
    return new_fun 

Tôi nhận thấy chức năng trang trí 'vui nhộn' hoạt động giống như hộp màu đen bên trong trang trí. Tôi có thể chọn để sử dụng vui vẻ() hoặc không phải ở tất cả bên trong new_fun. Tuy nhiên, tôi không biết liệu tôi có thể đột nhập vào 'vui' và tương tác với phạm vi địa phương của niềm vui bên trong new_fun không?

ví dụ: Tôi đang cố gắng để thực hiện một đồ chơi Remote Procedural Call (RPC) với python.

def return_locals_rpc_decorator(fun): 
    def decorated_fun(*args, **kw): 
     local_args = fun(*args, **kw) 
     # pickle the local_args and send it to server 
     # server unpickle and doing the RPC 
     # fetch back server results and unpickle to results 
     return rpc_results 

    return decorated_fun 


@return_locals_rpc_decorator 
def rpc_fun(a, b, c=3): 
    return locals() # This looks weird. how can I make this part of the decorator? 


print(rpc_fun(2, 1, 6)) 

Trong ví dụ này, tôi cố gắng lấy danh sách đối số của rpc_fun khi chạy bằng lệnh 'locals()'. Sau đó gửi nó đến máy chủ để thực hiện. Thay vì để rpc_fun trả về local() của nó, có thể sử dụng trình trang trí để lấy không gian đối số của hàm được trang trí không?

Trả lời

3

Bạn có thể sử dụng chú thích chức năng cho Python3:

def return_locals_rpc_decorator(fun): 
    def decorated_fun(*args, **kw): 
     local_args = fun(*args, **kw) 
     print(local_args) 
     fun_parameters = fun.__annotations__ 
     final_parameters = {a:list(args)[int(b[-1])-1] for a, b in fun_parameters.items() if a != 'return'} 
     return final_parameters 
    return decorated_fun 

@return_locals_rpc_decorator 
def my_funct(a:"val1", b:"val2", c:"val3") -> int: 
    return a + b + c 

print(my_funct(10, 20, 30)) 

Output:

60 
{'a': 10, 'b': 20, 'c': 30} 

Bằng cách này, bạn đang sử dụng các chức năng bao bọc decorated_fun để truy cập các thông số chức năng trang trí và biết thêm thông tin theo quy định của chú thích. Tôi đã thay đổi các mô tả tham số trong các chú thích sao cho mỗi giá trị chuỗi sẽ kết thúc bằng một chữ số có thể được sử dụng để lập chỉ mục args. Tuy nhiên, nếu bạn không muốn thay đổi các mô tả tham số trong các chú thích, bạn có thể sắp xếp thông qua ký tự kết thúc.

Chỉnh sửa: mã trong cơ thể của my_funct được thực hiện khi gọi trong hàm wrapper (decorated_fun), kể từ khi args, khai báo trong phạm vi decorated_fun được truyền đến và giải nén trong local_args.

+0

Tôi không hiểu cách làm việc này. Những gì tôi cần là làm cho 'fun_parameters' bên trong 'decorated_fun' bằng {'a': 10, 'b': 20, 'c': 30} khi chạy, để tôi có thể gửi nó đến máy chủ. Điều này có thể không? –

+0

@ShichuZhu vui lòng xem chỉnh sửa gần đây của tôi. – Ajax1234

+0

Tuyệt vời! Điều này hoàn toàn giải quyết vấn đề của tôi! Hai câu hỏi còn lại nếu bạn không nhớ: 1. Mọi thứ trong phần thân hàm (tức là a + b + c) sẽ không bao giờ được thực thi, đúng không? 2. (nvm ... Tôi đã phạm sai lầm ...) –

Các vấn đề liên quan