Jer*_*Gao 25 python if-statement flow-control
对于以下代码
a =func()
if a != None:
b.append(a)
Run Code Online (Sandbox Code Playgroud)
a可以分配给None,有没有办法避免if语句只使用一行代码?
原始问题如下
import xml.etree.ElementTree as etree
r = etree.parse(f).getroot()
b = etree.Element('register',{})
a = r.find('tag_name') # a may get None if did not find it
if a != None:
b.append(a)
Run Code Online (Sandbox Code Playgroud)
好吧,我用了所有的答案并得到了这个,我个人认为这是迄今为止我写过的最复杂的python,哈哈,哈哈
NS_MAP = {
'spirit' : 'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4',
'app' : 'http://www.app.com/SPIRIT-app'
}
mp=etree.Element('MemoryProperty', {'version':'alpha'})
mpt=etree.ElementTree(mp)
def copy_tags(tp, op, p, tn, ns='spirit'):
c = p.find('{%s}%s'%(NS_MAP[ns],tn))
if c is not None:
(op == '<-') and tp.append(c)
return c
for reg in regs:
te = etree.Element('register',{})
copy_tags(te,'<-',reg,'name')
copy_tags(te,'<-',reg,'addressOffset')
copy_tags(te,'<-',reg,'access')
(lambda e, t: copy_tags(te,'<-',t,'usageConstraints',ns='app') if t is not None else None)(te, copy_tags(te,'|',reg,'vendorExtensions'))
mp.append(te)
mpt.write('map_gen.xml')
Run Code Online (Sandbox Code Playgroud)
Ian*_*and 28
如果你可以事先调用func(),并且想要将测试语句和赋值语句组合成一个语句,那么你可以使用if-else表达式:
b += [a] if a is not None else []
Run Code Online (Sandbox Code Playgroud)
如果a不是None,那么这会将[a]添加到b - 基本上与b.append(a)相同的操作
如果a 为 None,则将[]添加到b,这将使b保持不变.
除非b是列表,或者至少支持"+ ="就地添加,否则这将不起作用.如果没有 - 也许它是一些自定义对象,那么你应该能够这样做:
(b.append(a) if a is not None else None)
Run Code Online (Sandbox Code Playgroud)
这是一个表达,评估其副作用,然后扔掉.如果a为None,则b.append(a)永远不会执行调用.在任何一种情况下,表达式的值都是None,但我们不关心它,因此它会被忽略.
现在,如果你想将func()调用与此结合,那么你将不得不做一些不同的事情,以避免两次调用func.如果你可以使用"+ ="语法,那么你可以这样做:
b += filter(None, [func()])
Run Code Online (Sandbox Code Playgroud)
filter(None, <list>)返回包含所有false元素的列表(包括None,但也删除0和[]).然后,该语句将[func()]或[]添加到b.
将帖子
最后,对于最坏的情况:如果你不能叫FUNC()超过一次,并且不能使用b += <list>,并且需要接受0,"",[]等,只有排除None,和你需要这一切都在一行,这是最丑陋的代码行:
(lambda l, a: l.append(a) if a is not None else None)(b, func())
Run Code Online (Sandbox Code Playgroud)
这基本上是@ ekhumoro的解决方案,压缩成一行.它定义了一个匿名函数,调用它,丢弃该值,然后丢弃该函数,所有这些都是为了副作用.
现在,这是一行,但它比原始代码更容易阅读或理解.如果我是你,我会坚持使用原版,或者使用@ ekhumoro的想法,只需定义辅助函数并使用它.
你在这里问了一个错误的问题.线索在你对其中一条评论的回复中,你说"我有10个以上的标签,如果我能获得3行到1行,我将节省20多行".
所以你的问题实际上并不是你有3行代码,而是你不必要地反复重复3行代码.您可以使用函数来提取重复的行,但听起来在这种情况下您实际上可能需要一个循环:
THE_TAGS = ('tag1', 'tag2', 'and so on')
for tag in THE_TAGS:
a = r.find(tag) # a may get None if did not find it
if a != None:
b.append(a)
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要附加到不同的列表:
def extract_tag(r, tag_name, to):
a = r.find(tag_name) # a may get None if did not find it
if a != None:
to.append(a)
extract_tag(r, 'tag1', b)
extract_tag(r, 'tag2', c)
Run Code Online (Sandbox Code Playgroud)