python - 将 partial 与条件默认参数一起使用

标签 python python-3.x lambda functools

我在库函数上使用 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])

但出现错误(有充分的理由!)

最佳答案

您可以改用包装函数:

def my_func(x, y):
    return library_func(x, y, {"1":7,"2":8}[str(y)])

或者,如果您不想按照评论中的建议重新键入所有关键字参数,您可以使用 inspect.signature 来获取包装函数的签名,然后绑定(bind)参数传递给参数,以便您可以使用字典键访问它们,无论参数是作为位置参数还是作为关键字参数传递:

import inspect

def my_func(*args, **kwargs):
    bound = sig.bind(*args, **kwargs)
    bound.apply_defaults()
    return library_func(**bound.arguments, z={"1":7,"2":8}[str(bound.arguments['y'])])

sig = inspect.signature(my_func)

关于python - 将 partial 与条件默认参数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749332/

相关文章:

python - 通过另一个函数调用函数时双输出

python - 查询期间失去与 MySQL 服务器的连接

linux - 设置 'correct' pip3

没有副本的 Python 切片?

lambda - 有没有一种方法可以使用zipWithNext kotlin压缩列表中的部分值?

Python "IN PLACE"函数

python - 在 Docker 容器中安装 OpenCV

python - pip 2 和 3 语法更改

forEach 循环期间的 java8 java.util.ConcurrentModificationException

java - 合并 Map<String, List<String> Java 8 Stream