File size: 2,144 Bytes
fc16538
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# TRI-VIDAR - Copyright 2022 Toyota Research Institute.  All rights reserved.

from vidar.utils.types import is_seq, is_dict


def iterate1(func):
    """Decorator to iterate over a list (first argument)"""
    def inner(var, *args, **kwargs):
        if is_seq(var):
            return [func(v, *args, **kwargs) for v in var]
        elif is_dict(var):
            return {key: func(val, *args, **kwargs) for key, val in var.items()}
        else:
            return func(var, *args, **kwargs)
    return inner


def iterate2(func):
    """Decorator to iterate over a list (second argument)"""
    def inner(self, var, *args, **kwargs):
        if is_seq(var):
            return [func(self, v, *args, **kwargs) for v in var]
        elif is_dict(var):
            return {key: func(self, val, *args, **kwargs) for key, val in var.items()}
        else:
            return func(self, var, *args, **kwargs)
    return inner


def iterate12(func):
    """Decorator to iterate over a list (first argument)"""
    def inner(var1, var2, *args, **kwargs):
        if is_seq(var1) and is_seq(var2):
            return [func(v1, v2, *args, **kwargs) for v1, v2 in zip(var1, var2)]
        elif is_dict(var1) and is_dict(var2):
            return {key: func(val1, val2, *args, **kwargs)
                    for key, val1, val2 in zip(var1.keys(), var1.values(), var2.values())}
        else:
            return func(var1, var2, *args, **kwargs)
    return inner


def multi_write(func):
    """Decorator to write multiple files"""
    def inner(filename, data, **kwargs):
        if is_seq(data):
            for i in range(len(data)):
                filename_i, ext = filename.split('.')
                filename_i = '%s_%d.%s' % (filename_i, i, ext)
                func(filename_i, data[i], **kwargs)
            return
        elif is_dict(data):
            for key, val in data.items():
                filename_i, ext = filename.split('.')
                filename_i = '%s(%s).%s' % (filename_i, key, ext)
                func(filename_i, val, **kwargs)
            return
        else:
            return func(filename, data)
    return inner