如果抛出异常,如何正确处理变量?

时间:2014-03-17 15:03:58

标签: python list exception python-2.7

这可能更像一个基于意见的问题,但无论如何我还会继续!

我有许多函数可以从远程设备获取多个值,我需要在进行计算时使用最新的值。作为一个远程设备,我在询问值时必须使用特定于设备的getter。

(我正在使用telnetlib,但我认为这无关紧要)

在实际使用中,可以安全地假设我将拥有大约10个以上的设备,并且每个设备可以获得10+个值。与设备的通信可能会失败并引发异常。在这种情况下,我收集的所有数据都是无用的,因为我需要全部进行计算,我不应该保存它,因为它不会是以后最新的值。

到目前为止,我的函数看起来像这样......主要的想法是,如果任何getter失败,附加行将不会被执行:

def GetTraits(object_list):
    trait_dict = {"Foo":[],"Bar":[]}
    for obj in object_list:
        try:
            Foo = obj.GetFoo()
            Bar = obj.GetBar()
            trait_dict["Foo"].append(Foo)
            trait_dict["Bar"].append(Bar)
        except Exception as e:
            print e
            # None type will be handled by other functions that need these values
            trait_dict["Foo"].append(None)
            trait_dict["Bar"].append(None)
    return trait_dict
然而,这感觉就像很多冗余的代码,因为我可以在该字典中拥有10个以上的特征。

有关如何改进此代码的任何想法?提前谢谢!

校准

1 个答案:

答案 0 :(得分:1)

类型,类和方法(以及类方法)都是python中的第一类对象。一种简单的方法是简单地将方法视为对象:

#...
trait_names= ("trait1", "trait2")
gets= (obj.GetTrait1, obj.GetTrait2())

try:
    for trait,get in zip(trait_names, gets):
        trait_dict[trait]=get()
except:
    for trait,get in zip(trait_names, gets):
        trait_dict[trait]=None

如果您有一致的命名方案,您可能希望使用字符串操作生成方法名称,并使用getattr获取它们。

t= "Trait1"
getter= getattr( obj, "Get"+t )