Python: 将额外的参数传递给 callable
Python: Pass extra arguments to callable
我有以下 python 代码:
import networkx as nx
def cost(i, j, d, value1, value2):
# some operation involving all these values
return cost
# graph is a networkx graph
# src, dst are integers
# cost is a callable that is passed 3 values automatically i.e. src, dst and d
# d is a dictionary of edge weights
path = nx.dijkstra_path(graph, src, dst, weight=cost)
现在我想将两个值 value1
和 value2
传递给 cost
函数。
networkx
文档说 weight
可以是一个只接受 3 个参数的可调用对象。但我需要 value1
和 value2
进行计算。如何做到这一点?
编辑
使用 functools 的解决方案效果很好。但是,我的函数在 class 中,如下所示:
import networkx as nx
import functools
class Myclass:
def cost(self, i, j, d, value2):
# some operation involving all these values
# also need self
# graph is a networkx graph
# src, dst are integers
# cost is a callable that is passed 3 values automatically i.e. src, dst and d
# d is a dictionary of edge weights
# path = nx.dijkstra_path(graph, src, dst, cost)
cost_partial = functools.partial(cost, self=self, value2=5)
path = nx.dijkstra_path(graph, src, dst, cost_partial)
使用这种方法,nx.dijkstra_path
坚持将 src
分配给 self
。因此,解释器抱怨 self
被分配了多个值。
我需要自己计算费用。
您只需要一个包装 cost
的函数。一种快速的方法是使用 functools.partial
.
import functools
def cost(i, j, d, value1, value2):
'Example function'
return i, j, d, value1, value2
# This makes a new function which takes all parameters of `cost` except those
# you've already passed. Here I'm going to set value1 and value2 to 1 and 2
# respectively.
cost_partial = functools.partial(cost, value1=1, value2=2)
# A new function that only accepts the 3 args i, j, d
cost_partial('i', 'j', 'd') # --> ('i', 'j', 'd', 1, 2)
# use as
path = nx.dijkstra_path(graph, src, dst, weight=cost_partial)
这很大程度上取决于value1
和value2
的含义。我建议添加一个可由 networkx 调用的包装器:
def cost_wrapper(i, j, d):
value1 = 0 # set values as needed
value2 = 1
return cost(i, j, d, value1, value2)
并提供给networkx:
path = nx.dijkstra_path(graph, src, dst, weight=cost_wrapper)
或者简单地让它们成为全局变量,而不是参数。
我有以下 python 代码:
import networkx as nx
def cost(i, j, d, value1, value2):
# some operation involving all these values
return cost
# graph is a networkx graph
# src, dst are integers
# cost is a callable that is passed 3 values automatically i.e. src, dst and d
# d is a dictionary of edge weights
path = nx.dijkstra_path(graph, src, dst, weight=cost)
现在我想将两个值 value1
和 value2
传递给 cost
函数。
networkx
文档说 weight
可以是一个只接受 3 个参数的可调用对象。但我需要 value1
和 value2
进行计算。如何做到这一点?
编辑 使用 functools 的解决方案效果很好。但是,我的函数在 class 中,如下所示:
import networkx as nx
import functools
class Myclass:
def cost(self, i, j, d, value2):
# some operation involving all these values
# also need self
# graph is a networkx graph
# src, dst are integers
# cost is a callable that is passed 3 values automatically i.e. src, dst and d
# d is a dictionary of edge weights
# path = nx.dijkstra_path(graph, src, dst, cost)
cost_partial = functools.partial(cost, self=self, value2=5)
path = nx.dijkstra_path(graph, src, dst, cost_partial)
使用这种方法,nx.dijkstra_path
坚持将 src
分配给 self
。因此,解释器抱怨 self
被分配了多个值。
我需要自己计算费用。
您只需要一个包装 cost
的函数。一种快速的方法是使用 functools.partial
.
import functools
def cost(i, j, d, value1, value2):
'Example function'
return i, j, d, value1, value2
# This makes a new function which takes all parameters of `cost` except those
# you've already passed. Here I'm going to set value1 and value2 to 1 and 2
# respectively.
cost_partial = functools.partial(cost, value1=1, value2=2)
# A new function that only accepts the 3 args i, j, d
cost_partial('i', 'j', 'd') # --> ('i', 'j', 'd', 1, 2)
# use as
path = nx.dijkstra_path(graph, src, dst, weight=cost_partial)
这很大程度上取决于value1
和value2
的含义。我建议添加一个可由 networkx 调用的包装器:
def cost_wrapper(i, j, d):
value1 = 0 # set values as needed
value2 = 1
return cost(i, j, d, value1, value2)
并提供给networkx:
path = nx.dijkstra_path(graph, src, dst, weight=cost_wrapper)
或者简单地让它们成为全局变量,而不是参数。