我想用一个或多个可选来源制作一个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是不可接受的。
我能做些什么吗?
修改
如下面的答案中所述,通过改变源列表的长度,可以通过一个可选参数的简单情况来解决这个问题。这不能使任意参数可选,所以我仍然对这样做的方式感兴趣。
答案 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代码,您可以随意使用该语言的全部功能。