模拟字符串以标记dict

时间:2017-04-13 16:02:31

标签: bazel

由于Bazel没有提供将标签映射到字符串的方法,我想知道如何通过Skylark解决这个问题。

遵循我的部分可怕"解决方法"。

首先是静态:

_INDEX_COUNT = 50

def _build_label_mapping():
    lmap = {}

    for i in range(_INDEX_COUNT):
        lmap ["map_name%s" % i] = attr.string()
        lmap ["map_label%s" % i] = attr.label(allow_files = True)

    return lmap

_LABEL_MAPPING = _build_label_mapping()

在实施中:

    item_pairs = {}
    for i in range(_INDEX_COUNT):
        id = getattr(ctx.attr, "map_name%s" % i)

        if not id:
            continue

        mapl = getattr(ctx.attr, "map_label%s" % i)


        if len(mapl.files):
            item_pairs[id] = list(mapl.files)[0].path
        else:
            item_pairs[id] = ""

    if item_pairs:
        arguments += [
            "--map", str(item_pairs), # Pass json data
        ]

然后是规则:

_foo = rule(
    implementation = _impl,
    attrs = dict({
        "srcs": attr.label_list(allow_files = True, mandatory = True),
    }.items() + _LABEL_MAPPING.items()),

需要包装的内容如下:

def foo(map={}, **kwargs):

    map_args = {}

    # TODO: Check whether order of items is defined
    for i, item in enumerate(textures.items()):
        key, value = item
        map_args["map_name%s" % i] = key
        map_args["map_label%s" % i] = value

    return _foo(
        **dict(map_args.items() + kwargs.items())
    )

在Skylark有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

要重新解释您的问题,您想要创建从字符串到标签的规则属性映射吗?

目前不支持此功能(请参阅list of attributes),但您可以为此提交功能请求。

你认为使用“label_keyed_string_dict”是一个合理的解决方法吗? (如果你有重复的密钥,它将无法工作)