将functools部分与多个参数一起使用

时间:2020-03-29 14:31:45

标签: python partial functools

假设我有一个函数

library("zoo")
library(tidyr)
library(magrittr)
library(dplyr)
package_info <- library(help = magrittr)$info[[2]]
package_info_tbl <- package_info %>% 
  stringr::str_split(pattern = "\\s+", n = 2, simplify = T) %>%
  # set colnames
  `colnames<-`(c("Function", "Title")) %>% 
  tibble::as_tibble() %>% 
  # explicit NAs
  dplyr::mutate(Function = if_else(Function == "", NA_character_, Function),
                # replace NAs with prior value
                Function = zoo::na.locf(Function)) %>% 
  # paste together the strings for each function
  group_by(Function) %>% 
  summarise(Title = paste(Title, collapse = " "))

我现在想通过使用def func(u,v,w,x, alpha = 4, beta = 5): print('u ',u) print('v ',v) print('x ',w) print('u ',x) print('** kwarqs: alpha ',alpha) print('** kwarqs: beta ',beta) return u*4 + v*3 + w*2 + x 使其成为部分功能。我将functools.partial变量设置为常量,并创建一个函数$$ part = f(x)| _ {u,v,w = \ text {const}} $$

u,v,w

结果是

u = 2
v = 4
w = 5

part = partial(func,u,v,w, alpha = 'Hello 1', beta = 'Hello 2')
print(part(4))

如何创建函数

u  2
v  4
w  5
x  4   # This is the remaining free variable
** kwarqs: alpha  Hello 1
** kwarqs: beta  Hello 2
34

最诚挚的问候


也可以解决问题。

2 个答案:

答案 0 :(得分:0)

对于您的情况,我可以建议使用lambda

f1 = lambda u : func(u,v,w,x, alpha = 4, beta = 5) 
f2 = lambda v, x: func(u,v,w,x, alpha = 4, beta = 5) 
f3 = lambda v, alpha: func(u,v,w,x, alpha = alpha, beta = 5)  

用法与您想要的相同:

f1(u) #or f(v),f(w)
f2(v,x) #or all other variable combinations
f3(v,alpha) # a combination of args and kwargs

答案 1 :(得分:0)

有趣的问题。您可以将其功能转换为仅kwarg的功能:

from functools import wraps, partial

def kwarged(func):
    @wraps(func)
    def wrapper(**kwargs):
        return func(**kwargs)
    return wrapper

然后您可以用来构建任何部分版本:

>>> func = kwarged(func)

>>> f_u = partial(func, v=5, w=2, x=4)
>>> f_u(u=7)
u  7
v  5
w  2
x  4
** kwarqs: alpha  4
** kwarqs: beta  5
51

>>> f_vx = partial(func, u=5, w=2) 
>>> f_vx(v=3, x=6)
u  5
v  3
w  2
x  6
** kwarqs: alpha  4
** kwarqs: beta  5
39
>>> f_vx(v=3, x=6, alpha=9)
u  5
v  3
w  2
x  6
** kwarqs: alpha  9
** kwarqs: beta  5
39

即使所有参数都是默认值的kwargs,您仍然必须传递未在局部中设置的所有原始位置args:

>>> f_vx(v=3, alpha=9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in wrapper
TypeError: func() missing 1 required positional argument: 'x'
相关问题