我对unpacking argument lists感到有点困惑。我试图以编程方式创建一个XSL-FO文件,因此需要在文件中的某个位置插入可变数量的元素。当然,我可以用其他方式(XML / XSLT,其他XML方法等),但我想知道为什么这不起作用,因为我的Python基础知识可能有点生疏。右边“右边”我试图插入我的column_elms列表作为可变数量的参数。请注意,这不会列出一个列表,如果我复制下一行的内容(E("table-column...),
一遍又一遍地复制它,实际上会生成所需的输出(多个table-column
元素。)但是解压缩这个,它只是给了我一个table-column
元素,无论如何。发生了什么?
from lxml.builder import ElementMaker
from lxml import etree as ET
COLUMNS = 8
E = ElementMaker(namespace='http://www.w3.org/1999/XSL/Format',
nsmap={'fo':"http://www.w3.org/1999/XSL/Format"})
column_elms = [E("table-column",{"column-width":"41mm"})] * COLUMNS
root = E("root",
E("layout-master-set",
E("simple-page-master",
{"master-name":"label-sheet",
"margin-left":"5mm",
"margin-right":"5mm",
"margin-top":"14mm",
"margin-bottom":"14mm"},
E("region-body"))),
E("page-sequence",
{"master-reference":"label-sheet"},
E("flow", {"flow-name":"xsl-region-body"},
E("table", *column_elms # **RIGHT HERE**
# E("table-column",{"column-width":"41mm"}),
))))
答案 0 :(得分:1)
您正在创建一个包含相同对象的COLUMNS
个副本的列表:
column_elms = [E("table-column",{"column-width":"41mm"})] * COLUMNS
以上代码不会调用E()
8次,它会将其称为一次,然后将8个引用放入列表中。
就像你跑了一样:
column_elms = []
tcolumn = E("table-column",{"column-width":"41mm"})
for i in range(COLUMNS):
column_elms.append(tcolumn)
改为使用列表理解:
column_elms = [E("table-column",{"column-width":"41mm"}) for _ in xrange(COLUMNS)]
将评估循环中每次运行的E(..)
表达式。