Build a list of lists from the command line

I am writing a small simulation in python that should collect the results in various ways depending on the command line arguments.

Once the simulation is running and the object Simulationcontains the original results, I want to use a method Simulation.sample(list_of_objects)or method Simulation.sample_differently()to generate some outputs for each specified sampler. list_of_objectsmust be either range(N)or a list explicitly specified on the command line.

For example, I would like to perform the following calculations.

$ 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])]

I thought I would do it as follows.

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)

Unfortunately, the constructor typeworks in each separate command line argument, and not in the list of several of them generated for nargs≠None, therefore the approach described above does not work.

?

+4
2

type . - , . nargs* , , .

Pythonic ( ) - . argparse simulation.

, , ( ):

parser = argparse.ArgumentParser()
parser.add_argument("--sample", type=int, action='append')
parser.add_argument("--sample-differently", action="store_true")
parser.add_argument("--sample-objects", nargs="*", action="append")
args = parser.parse_args()

--sample, --sample-objects True/False --sample-differently.

simulation ( ):

alist = []
if args.sample_differently:
    alist.append(Simulation.sample_differently())
for i in args.sample:
    # is a number
    alist.append(Simulation.sample(range(i)))
for i in args.sample_objects:
    # i will be a list of strings
    def foo(i):
        # conditionally convert strings to integers
        res = []
        for j in i:
            try:
                j = int(j)
            except ValueError:
                pass
        res.append(j)
        return res
    alist.append(Simulation.sample(foo(i))

, alist .

Action, Simulation.sample. values, namespace. , .

===============

'-samples-objects':

def intorstr(astr):
        # conditionally convert strings to integers
        try:
            astr = int(astr)
        except ValueError:
            pass
        return astr

class SamplesAction(argparse._AppendAction):
    # adapted from _AppendAction
    def __call__(self, parser, namespace, values, option_string=None):
         values = Simulation.sample(values)
         items = _copy.copy(_ensure_value(namespace, self.dest, []))
         items.append(values)
         setattr(namespace, self.dest, items)

parser.add_argument("--sample-objects", nargs="*", 
    action=SamplesAction, dest="sample", type=intorstr)

, lambda simulation: simulation..... , , . lambdas .

+1

, - , , " pythonic", , , - CSV-, parse_objects_to_sampler .

:

def parse_objects_to_sampler(input_string):
object_string = input_string.split(",")

objects = []
for entry in object_strings:
    try:
        objects.append(int(entry))
    except ValueError:
        objects.append(entry)
return lambda simulation: simulation.sample(objects))

, :

simulation --sample-objects "0,1,2,3,a"

, , !

+1

Source: https://habr.com/ru/post/1661958/


All Articles