为什么我的Python参数没有解包?
我有点困惑。我试图以编程方式创建XSL-FO文件,因此需要在文件中的某个位置插入数量可变的元素。当然,我可以用其他方法(XML/XSLT、其他XML方法等)来实现这一点,但我想知道为什么这样做不起作用,因为我对Python的基本知识可能有点生疏了。通过“Right HERE”,我试图将我的列作为可变数量的参数插入。请注意,这并不需要一个列表,如果我复制下一行(为什么我的Python参数没有解包?,python,argument-passing,Python,Argument Passing,我有点困惑。我试图以编程方式创建XSL-FO文件,因此需要在文件中的某个位置插入数量可变的元素。当然,我可以用其他方法(XML/XSLT、其他XML方法等)来实现这一点,但我想知道为什么这样做不起作用,因为我对Python的基本知识可能有点生疏了。通过“Right HERE”,我试图将我的列作为可变数量的参数插入。请注意,这并不需要一个列表,如果我复制下一行(E(“table column…”)上的内容,它确实会一次又一次地产生所需的输出(多个table column元素。但是,通过解包,不管发
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"}),
))))
您正在创建一个包含相同对象的
列
副本的列表:
上面的代码没有调用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(..)
表达式。您正在创建一个包含相同对象的列的列表:
上面的代码没有调用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(…)
表达式。一个未经测试的预感:尝试将column_elms=[E(“table column”,“column width:“41mm”)替换为column_elms=[E(“table column”,“column width:“41mm”)来表示范围(COLUMNS)]
?@Dougal:Tested,它可以工作。(我猜它在某个时候会变成一个集合或一个字典,这意味着子类的重复实例将只计算一次)。你应该作为答案发布。@Dougal-这确实有效,谢谢。结果表明,将它们相乘会产生完全相同的元素(在相同的地址)一个未经测试的预感:尝试用column_elms=[E(“table column”,“column width:“41mm”)]替换column_elms=[E(“table column”,“column width:“41mm”)作为范围内(COLUMNS)]
?@Dougal:测试过,它可以工作。(我猜它在某个时候会变成一个集合或一本字典,这意味着重复的儿童实例将只计算一次)。你应该作为答案发布。@Dougal-这确实有效,谢谢。结果是将它们相乘会产生完全相同的元素(在相同的地址)。请回答,我将其标记为答案。