我对此感到麻烦...我有一些代码使用functools.partial
,因此我可以将无参数函数传递给后续函数。我拥有的所有示例均来自random
,并返回整数,例如:
def main():
random.seed()
adist = functools.partial(random.uniform, 20, 2000) # no parameter function that returns int
tdist = functools.partial(random.randrange, 4096) # no parameter function returning int
这些随后将在如下所示的构造函数中使用:
for n in range(4):
random.seed()
env = simpy.Environment() # Create the SimPy environment
line = runSim(env, adist, sdist, tdist) # dists expected to be ints
并且每次执行runSim时,我们都会根据partial
定义中所述的分布获得不同的随机值。我接下来要做的只是定义另一个分布部分函数,但是这个函数正在使用random.choices()
,它返回list而不是integer -如果我们严格执行此操作,则会使它版本与其余代码不兼容,需要使用数字类型)
sdist = functools.partial(random.choices, population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])
我似乎无法弄清楚如何构建或修改部分函数,使其也返回整数。我无法直接对可调用对象进行下标,即使它返回了列表。我认为可能有一些方法可以合并部分(嵌套部分?部分部分?),但我一直无法弄清楚。
而不是partial
,只需编写一个不包含任何参数并以所需形式返回所需值的包装函数:
def sdist():
return random.choices(population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])[0]
如果要使细线成一行,只需使用lambda关键字:
sdist = lambda: random.choices(population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])[0]