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

2024-06-01 05:01:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能更像是一个基于观点的问题,但我还是会继续

我有许多从远程设备获取多个值的函数,在计算时需要使用最新的值。因为它是一个远程设备,所以在请求值时必须使用特定于设备的getter

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

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

到目前为止我的功能是这样的。。。其主要思想是,如果任何getter失败,将不会执行append行:

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+个特征

关于如何改进这段代码有什么想法吗?提前谢谢

卡尔


Tags: 函数代码noneobj远程objectfoobar
1条回答
网友
1楼 · 发布于 2024-06-01 05:01:08

类型、类和方法(以及类方法)都是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 )

相关问题 更多 >