2012-08-06 36 views
8

Các tài liệu cho functools.partial nói rằng đó là "tương đương với":thực hiện functools.partial rằng prepends lập luận thêm

def partial(func, *args, **keywords): 
    def newfunc(*fargs, **fkeywords): 
     newkeywords = keywords.copy() 
     newkeywords.update(fkeywords) 
     return func(*(args + fargs), **newkeywords) # line to change 
    newfunc.func = func 
    newfunc.args = args 
    newfunc.keywords = keywords 
    return newfunc 

Nếu tôi muốn thực hiện một phiên bản đó prepends các đối số bổ sung, có vẻ như như tôi chỉ cần thay đổi dòng được chỉ định.

Có bất kỳ tính năng/gotchas nào khác mà tôi phải lo lắng về việc chỉ sao chép mã này không?

Trả lời

6

Nhìn vào mã nguồn cho _functoolsmodule.c, tôi không nghĩ có nhiều điều phải lo lắng.

Việc thực hiện mô-đun của partial xử lý tẩyrepr, nhưng mọi thứ khác có vẻ như nó hoạt động như trong tài liệu như vậy có lẽ là lý do nó được thực hiện trong C là chỉ cho hiệu quả. Ngoài ra còn có một thực tế rằng nó là một loại thay vì chỉ là một đóng cửa chức năng.

Lưu ý, tuy nhiên, trong ví dụ về tài liệu, func, argskeywords hoàn toàn là mỹ phẩm; chúng không thể ghi đè như chúng thực tế với functools.partial trường hợp thực tế. Một thay thế sẽ là phân lớp functools.partial:

class rpartial(partial): 
    def __call__(self, *args, **kwargs): 
     kw = self.keywords.copy() 
     kw.update(kwargs) 
     return self.func(*(args + self.args), **kwargs) 
+0

Đã không nghĩ đến việc phân lớp nội trang. – Dave

+0

Điều này là tuyệt vời, nhưng tôi nghĩ rằng nó nên đọc: lớp rpartial (một phần): def __call __ (self, * args, ** kwargs): kw = self.keywords.copy() kw.update (kwargs) return self.func (* (args + self.args), ** kw) – ishmael

+0

@ishmael cảm ơn, đã sửa. – ecatmur

0

Một cạm bẫy là cách phân công một phần của bạn sẽ xử lý đối số tùy ý, chẳng hạn như trong ví dụ sau:

def f(a,b, *args): 
    pass 

Bây giờ một phần áp dụng f để các đối số 1 và 2:

g = partial(f, 1, 2) 

là gì giá trị của thông số b trong g? Có phải là 1, hoặc nó vẫn đang chờ một giá trị? Đối với vấn đề đó, giá trị của a là gì? Nói cách khác, bao nhiêu, nếu có, của các đối số được cung cấp nên được coi là đối số bổ sung.

+0

Đây là một nhận xét tốt, nhưng tôi muốn khai báo từ đồng nghĩa là 'g() == f (1,2); g (x) == f (x, 1,2); g (x, y) == f (x, y, 1,2) ', v.v. Mà có thể là lẻ, nhưng có hệ thống. – Dave

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