我可以想象一种情况,实际上执行许多这样的单行 try-excepts 可能很有用,而无需每次都添加 try-except 块。
假设您有一个字典 d 和一个对象 o。对象具有三个属性:“a”、“b”和“c”。字典 d 是使用一些函数 generate_dict() 生成的,可能有以下键:'x'、'y' 和 'z',但你不能确定它们中的哪一个出现在给定的字典中。您想将键“x”的值分配给属性“a”,将“y”分配给属性“b”等。在这种情况下,您必须用 try-catch 包围每个分配,如下所示:
o = Object()
d = generate_dict()
try:
o.a = d['x']
except:
pass
try:
o.b = d['y']
except:
pass
等等。您也可以用检查字典中是否存在给定键来替换 try-excepts,但问题仍然存在。如果你有几十个键属性映射会发生什么?行数增长很快。
另一种编码方式是生成两个属性和键名表,并使用 exec 函数在循环中执行代码,如下所示:
o = Object()
d = generate_dict()
attributeNames = ['a', 'b', 'c']
dataDictKeys = ['x', 'y', 'z']
for (attr, key) in zip(attributeNames, dataDictKeys):
try:
exec("o.{attr} = d['{key}']".format(attr = attr, key = key))
except:
pass
虽然这不是一个很好的编码实践来做这些事情,但这仍然可以以某种方式解决你的问题。但请谨慎使用。