假设我有一个函数
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
?
最诚挚的问候
也可以解决问题。
答案 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'