1

Python đi kèm với một mô-đun thú vị được gọi là funcools . Một trong các lớp của nó là lớp một phần . Bạn có thể sử dụng nó để tạo một hàm mới với ứng dụng một phần các đối số và từ khóa mà bạn truyền cho nó. Bạn có thể sử dụng một phần để "đóng băng" một phần đối số và / hoặc từ khóa của hàm dẫn đến một đối tượng mới. Một cách khác để đặt nó là một phần tạo ra một chức năng mới với một số mặc định. Hãy xem xét một ví dụ.

>>> from functools import partial
>>> def add(x, y):
...     return x + y
... 
>>> p_add = partial(add, 2)
>>> p_add(4)
6

Ở đây chúng ta tạo một hàm thêm đơn giản trả về kết quả của việc thêm các đối số của nó, x và y. Tiếp theo, chúng ta tạo một cuộc gọi mới bằng cách tạo một thể hiện của một phần và chuyển nó đến hàm của chúng ta và một đối số cho hàm đó. Nói cách khác, về cơ bản, chúng tôi mặc định tham số x của hàm add của chúng tôi là số 2. Cuối cùng, chúng tôi gọi hàm mới có thể gọi là p_add , với đối số của số 4 dẫn đến 6 vì 2 + 4 = 6.

Một trường hợp sử dụng tiện dụng cho các partials là truyền đối số cho các cuộc gọi lại. Hãy xem wxPython:

import wx

from functools import partial 


########################################################################
class MainFrame(wx.Frame):
    """
    This app shows a group of buttons
    """

    #----------------------------------------------------------------------
    def __init__(self, *args, **kwargs):
        """Constructor"""
        super(MainFrame, self).__init__(parent=None, title='Partial')
        panel = wx.Panel(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        btn_labels = ['one', 'two', 'three']
        for label in btn_labels:
            btn = wx.Button(panel, label=label)
            btn.Bind(wx.EVT_BUTTON, partial(self.onButton, label=label))
            sizer.Add(btn, 0, wx.ALL, 5)

        panel.SetSizer(sizer)
        self.Show()

    #----------------------------------------------------------------------
    def onButton(self, event, label):
        """
        Event handler called when a button is pressed
        """
        print 'You pressed: ', label


if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

Ở đây chúng tôi sử dụng một phần để gọi trình xử lý sự kiện onButton với một đối số phụ, đó là nhãn của nút. Điều này có vẻ không hữu ích cho bạn, nhưng nếu bạn lập trình GUI nhiều, bạn sẽ thấy rất nhiều người hỏi làm thế nào để làm điều này. Tất nhiên, bạn cũng có thể sử dụng lambda thay vì chuyển các đối số cho các cuộc gọi lại.

Một trường hợp sử dụng mà chúng tôi đã sử dụng tại nơi làm việc là cho khung kiểm tra tự động của chúng tôi. Chúng tôi đã thử nghiệm giao diện người dùng với Python và chúng tôi muốn có thể chuyển một hàm cùng để loại bỏ các hộp thoại nhất định. Về cơ bản, bạn sẽ chuyển một hàm cùng với tên của hộp thoại để loại bỏ, nhưng nó sẽ cần được gọi tại một điểm nhất định trong quy trình để hoạt động chính xác. Vì tôi không thể hiển thị mã đó, đây là một ví dụ thực sự cơ bản về việc truyền một phần chức năng xung quanh:

from functools import partial

#----------------------------------------------------------------------
def add(x, y):
    """"""
    return x + y

#----------------------------------------------------------------------
def multiply(x, y):
    """"""
    return x * y

#----------------------------------------------------------------------
def run(func):
    """"""
    print func()

#----------------------------------------------------------------------
def main():
    """"""
    a1 = partial(add, 1, 2)
    m1 = partial(multiply, 5, 8)
    run(a1)
    run(m1)

if __name__ == "__main__":
    main()

Ở đây chúng tôi tạo ra một vài chức năng một phần trong chức năng chính của chúng tôi . Tiếp theo, chúng ta chuyển các partials đó cho hàm chạy của chúng ta , gọi nó và sau đó in ra kết quả của hàm được gọi.

Kết thúc

Tại thời điểm này, bạn nên biết cách sử dụng một phần funcools để tạo các cuộc gọi "đóng băng" của riêng bạn. Các hạt có nhiều công dụng, nhưng chúng không phải lúc nào cũng rõ ràng. Tôi khuyên bạn nên bắt đầu thử nghiệm với chúng và bạn có thể bắt đầu thấy việc sử dụng mã của riêng bạn. Chúc vui vẻ!

|