我正在使用Python编写一个小型模拟程序,根据命令行参数以不同的方式汇总结果。
一旦模拟运行完成并且 Simulation
对象包含原始结果,我想使用 Simulation.sample(list_of_objects)
方法或 Simulation.sample_differently()
方法为每个指定的采样器生成一些输出。 list_of_objects
应该是一个 range(N)
或在命令行上显式指定的列表。
例如,我希望发生以下计算:
$ simulation --sample 5
[Simulation.sample(range(5))]
$ simulation --sample-objects 0 1 2 3 a
[Simulation.sample([0, 1, 2, 3, "a"])]
$ simulation --sample 4 --sample-objects 1 3 "b"
[Simulation.sample(range(4)), Simulation.sample([1, 3, "b"])]
$ simulation --sample-differently --sample-objects 1
[Simulation.sample_differently(), Simulation.sample([1])]
$ simulation --sample-objects 0 1 2 --sample-objects 3 4
[Simulation.sample([0, 1, 2]), Simulation.sample([3, 4])]
我会按照以下方式来做。
def parse_objects_to_sampler(object_strings):
objects = []
for entry in object_strings:
try:
objects.append(int(entry))
except ValueError:
objects.append(entry)
return lambda simulation: simulation.sample(objects))
parser = argparse.ArgumentParser()
parser.add_argument(
"--sample", action=append,
type=lambda x: lambda simulation: simulation.sample(range(int(x))))
parser.add_argument(
"--sample-differently", action="append_const", dest="sample",
const=Simulation.sample_differently)
parser.add_argument(
"--sample-objects", nargs="*", action="append", dest="sample",
type=parse_objects_to_sampler)
for sampler in parser.parse().sample:
sampler(Simulation)
很不幸,type
构造函数作用于每个单独的命令行参数,而不是针对nargs≠None
生成的多个参数列表。因此上述方法无法实现。
那么如何以最佳的Python方式实现上述行为呢?