带可选源的构建器

时间:2015-10-22 15:24:02

标签: scons

我想用一个或多个可选来源制作一个Builder。

我试过了:

env.Append(BUILDERS = {'my_builder': Builder(action = Action(do_something))})

def do_something(target, source, env):
    if source[1]:
        do_optional_stuff(source[1])
    do_other_stuff(target, source[0])

...

env.my_builder(target.txt, [source1, None])    # Fails
env.my_builder(target.txt, [source2, source3]) # Okay

麻烦的是,当我传入None时,我得到'NoneType' object has no attribute 'get_ninfo',因为scons期待Node个参数,而None是不可接受的。

我能做些什么吗?

修改

如下面的答案中所述,通过改变源列表的长度,可以通过一个可选参数的简单情况来解决这个问题。这不能使任意参数可选,所以我仍然对这样做的方式感兴趣。

1 个答案:

答案 0 :(得分:3)

不是添加虚假元素,而是检查 source 列表的长度(或者更好的是,在第一个元素之后开始迭代列表):

def do_something(target, source, env):
    if len(source) > 1:
        do_optional_stuff(source[1])
    # or:
    # for opt_src in source[1:]:
    #   do_optional_stuff(opt_src)
    do_main_stuff(target, source[0])

env.Append(BUILDERS = {'my_builder': Builder(action = Action(do_something))})

env.my_builder('target-2.txt', ['foo.txt'])
env.my_builder('target-1.txt', ['foo.txt', 'bar.txt'])

此方法的一个问题是您需要确保以正确的顺序列出您的来源。根据您正在执行的操作的详细信息,您可以通过匹配文件名或扩展名来过滤列表。毕竟,这是Python代码,您可以随意使用该语言的全部功能。