模拟字符串以标记字典



由于 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())
    )

在云雀中有更好的方法吗?

为了改写您的问题,您想创建从字符串到标签的规则属性映射吗?

目前不支持此功能(请参阅属性列表(,但您可以为此提交功能请求。

您认为使用"label_keyed_string_dict"是一种合理的解决方法吗?(如果您有重复的密钥,它将不起作用(

最新更新