【发布时间】:2019-05-13 22:20:01
【问题描述】:
我在库函数上使用partial 为其中一个参数提供默认值
library_func = lambda x, y, z : x + y + z
my_func = functools.partial(library_func, z = 5) #default value for one of the variables
# equiv to lambda x, y : x + y + 5
现在假设我希望 z 依赖于 y 的值,而不是一个恒定的默认 z。例如,我们在字典中查找 z,其中的键是 y 的不同值。
z = {"1":7,"2":8}[str(y)]
# now my_func(x,y) = library_func(x,y,z = f(y))
这可能吗?在我的用例中,我有一个类持有与数据库的连接 (self.engine)
self.engine = sqlalchemy.create_engine(connection_string)
self.read_sql = partial(pd.read_sql, con = self.engine)
而pd.read_sql 的签名类似于pd.read_sql(con , name, columns ...)
我想为取决于传递的名称值的列设置默认值。
我想过
self.read_sql = partial(pd.read_sql, con = self.engine, columns = lambda name: self.name_to_column_dict[name])
但得到错误(有充分的理由!)
【问题讨论】:
-
我认为最简单的方法是定义一个简单的包装函数,它采用
x和y,准备z并调用您的库函数。 -
@Wombatz 是的,但如果我这样做,我是否必须手动输入所有参数?这似乎有点绕房子
-
包装函数或装饰器对我来说似乎是最好的。避免使用
functools.partial,除非是最琐碎的情况。 -
@wim 不希望遇到太新手,我喜欢使用部分函数的一个重要原因是因为它保留了 Jupyter Notebook Intellisense/autocomplete 中的所有文档字符串和关键字 arg 内容。但正如你所说,也许对于更复杂的情况,你自己动手会更容易。
-
要保留文档字符串,您可以使用
functools.wraps。
标签: python python-3.x lambda functools