Je suis en train d'écrire une petite simulation en python, qui est censée agréger les résultats de différentes manières en fonction des arguments de la ligne de commande.
Une fois que la simulation a été exécutée et que l'objet Simulation
contient les résultats bruts, je veux utiliser la méthode Simulation.sample(list_of_objects)
ou la méthode Simulation.sample_differently()
pour générer des sorties pour chaque échantillonneur spécifié. list_of_objects
devrait être soit un range(N)
soit une liste spécifiée explicitement en ligne de commande.
Par exemple, j'aimerais que les calculs suivants se produisent.
$ 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])]
J'ai pensé le faire de la manière suivante.
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)
Malheureusement, le constructeur type
opère sur chaque argument de ligne de commande individuel, et non sur la liste de plusieurs d'entre eux générée pour nargs≠None
, donc l'approche ci-dessus ne fonctionne pas.
Quelle est la meilleure façon, selon les principes de python, d'obtenir le comportement décrit ci-dessus ?