Python:';内联';一行代码中多个异常源的异常处理

Python:';内联';一行代码中多个异常源的异常处理,python,exception,Python,Exception,考虑下面这段简单的代码,它将MyClass()对象的一些属性存储在一个列表中: c = MyClass() props = [c.property1, c.property2, ..., c.propertyN] 现在,在引擎盖下,c.property1..N被实现为@property-修饰的getter函数,在执行过程中可能引发异常。在这种情况下,我希望在列表分配中使用默认值(“n/a”),而不是不可访问的属性值 但我不想跳过整个列表作业。因此,如果只有c.property2导致异常,结果仍

考虑下面这段简单的代码,它将
MyClass()
对象的一些属性存储在一个列表中:

c = MyClass()
props = [c.property1, c.property2, ..., c.propertyN]
现在,在引擎盖下,
c.property1..N
被实现为
@property
-修饰的getter函数,在执行过程中可能引发异常。在这种情况下,我希望在列表分配中使用默认值(“n/a”),而不是不可访问的属性值

但我不想跳过整个列表作业。因此,如果只有
c.property2
导致异常,结果仍然应该是:

props = ['value_of_property1', 'n/a', ..., 'value_of_propertyN']
因此,除了围绕整个列表分配外,我无法将try包装起来:

c = MyClass()
try:
   props = [c.property1, c.property2, ..., c.propertyN]
except MyException:
   props = # yes, what?
当然,除了每个元素之外,我可以单独尝试:

c = MyClass()
props = []

try:
    props.append(c.property1)
except MyException:
    props.append('n/a')

try:
    props.append(c.property2)
except MyException:
    props.append('n/a')

# repeated N times
。。。但这会使代码膨胀,感觉不对劲

是否存在某种类型的内联异常处理?

可能与这些内联if-else语句类似:

props = [c.property1 if len(c.property1) else 'n/a',
         c.property2 if len(c.property2) else 'n/a',
         ...
         c.propertyN if len(c.propertyN) else 'n/a',
        ]
注意事项:

  • 我可以完全控制
    MyClass()
    和getter函数的代码

  • 修改getter函数以在内部处理异常并立即返回默认值不是一个选项,因为在其他情况下,我想知道(通过异常…)属性是否可访问。否则,我如何判断“n/a”是属性的真实值还是替换的默认(回退)值

  • 我在使用
    (N*'{};').format(c.property1,c.property2,…,c.propertyN)打印语句时也有同样的问题。


    • 没有内联异常处理,但有更好的方法:循环。您的代码中没有一个是正确的,但这很容易通过循环修复:

      c = MyClass()
      props = []
      prop_names = ['property1', 'property2', ...]
      
      for prop_name in prop_names:
          try:
              value = getattr(c, prop_name)
          except MyException:
              value = 'n/a'
      
          props.append(value)
      

      如果需要执行比仅访问属性更复杂的操作,可以使用函数列表替换属性名称列表:

      c = MyClass()
      props = []
      getters = [lambda c: c.property1, lambda c: c.property2, ...]
      
      for getter in getters:
          try:
              value = getter(c)
          except MyException:
              value = 'n/a'
      
          props.append(value)
      

      对于
      print
      问题,请使用
      print(*props,sep=';')
      。另请参阅:@Aran Fey Yes-只要
      props
      已经存在,并且预期的输出格式与上述示例中的格式一样简单。因此,您是否建议先创建列表(使用下面答案中的
      getattr()
      循环),然后打印列表中的元素,而不是直接打印属性?