2015-04-09 17 views
5

Tôi muốn sử dụng một phần từ functools để một phần áp dụng đối số thứ hai của hàm số, tôi biết nó rất dễ dàng để làm với lambda chứ không phải là một phần như saucách áp dụng một phần đối số tùy ý của hàm?

>>> def func1(a,b): 
...  return a/b 
... 
>>> func2 = lambda x:func1(x,2) 
>>> func2(4) 
2 

nhưng tôi nghiêm túc muốn sử dụng một phần ở đây (vì lợi ích học tập) vì vậy tôi đã nghĩ ra điều này.

>>> def swap_binary_args(func): 
...  return lambda x,y: func(y,x) 
... 
>>> func3 = partial(swap_binary_args(func1),2) 
>>> func3(4) 
2 

Có thể mở rộng chiến lược này lên một tầm cao nơi tôi có thể một phần áp dụng bất kỳ tranh luận tại bất cứ nơi nào như trong mã giả sau

>>>def indexed_partial(func, list_of_index, *args): 
...  ###do_something### 
...  return partially_applied_function 

>>>func5=indexed_partial(func1, [1,4,3,5], 2,4,5,6) 

trong trường hợp của chúng tôi có thể sử dụng chức năng này như sau

>>>func6=indexed_partial(func1, [1], 2) 

Có thể có phần được lập chỉ mục như tôi muốn không? có điều gì tương tự với điều này mà tôi không biết? và quan trọng hơn là ý tưởng về một phần được lập chỉ mục nói chung là một ý tưởng tốt hay xấu tại sao?

Câu hỏi này đã được đánh dấu là có thể trùng lặp của Can one partially apply the second argument of a function that takes no keyword arguments? trong câu hỏi rằng OP hỏi là nó có thể một phần áp dụng đối số thứ hai nhưng ở đây tôi đang hỏi làm thế nào để nấu một chức năng mà một phần có thể áp dụng bất kỳ lập luận tùy tiện

+4

Bạn đã xem là chỉ sử dụng đối số được đặt tên? 'functools.partial' cho phép chúng, và đó là cách bạn xử lý nó trong mã thực, mặc dù có thể nó sẽ không phù hợp với bài tập của bạn. – jwilner

+1

Bạn có lẽ có thể nấu một cái gì đó bằng cách sử dụng 'inspect.getargspec' và ràng buộc bằng cách sử dụng tên arg. – tzaman

+0

@jwilner một phần với đối số từ khóa sẽ hầu như tương đương với những gì tôi đang cố gắng đạt được, thay vì sử dụng chỉ mục, tôi nên sử dụng các khóa. Cảm ơn :) – k4vin

Trả lời

0

Tôi cũng nghĩ rằng những gì bạn yêu cầu không thể thực hiện được (dễ dàng?) Với functools.partial. Có lẽ giải pháp tốt nhất (và dễ đọc nhất) là sử dụng partial với các đối số từ khóa. Tuy nhiên, trong trường hợp bạn muốn sử dụng đối số vị trí (và do đó được lập chỉ mục đối số cục bộ), đây là một định nghĩa có thể có của indexed_partial:

def indexed_partial(func, list_of_index, *args): 
    def partially_applied_function(*fargs, **fkwargs): 
     nargs = len(args) + len(fargs) 
     iargs = iter(args) 
     ifargs = iter(fargs) 
     posargs = ((ifargs, iargs)[i in list_of_index].next() for i in range(nargs)) 
     return func(*posargs, **fkwargs) 
    return partially_applied_function 
Các vấn đề liên quan