【问题标题】:How to properly handle variables if an exception is thrown?如果抛出异常,如何正确处理变量?
【发布时间】:2014-03-17 15:03:57
【问题描述】:

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

我有许多从远程设备获取多个值的函数,我在进行计算时需要使用最新的值。由于它是一个远程设备,因此在请求值时我必须使用设备特定的 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 多个特征。

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

卡尔

【问题讨论】:

  • object_list 中的 obj 实际上是否有 obj.GetTrait1() 等编号方法?如果有,它们是如何编号的?
  • 不,它们是唯一的名称
  • 所以没有称为 .GetTrait[number here]() 的方法?
  • 不,Traits 被命名为 GetFoo()、GetBar() 等,我用这个编辑了问题

标签: python list exception python-2.7


【解决方案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 )

【讨论】:

  • 给定 obj 的每个特征都必须为 none,如果它们中的任何一个失败。
  • @Calpratt 在这种情况下,您只需将for 移动到try 内(并在除此之外再做一次)。见编辑
猜你喜欢
  • 2021-01-20
  • 2022-11-25
  • 2015-08-11
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2020-06-12
相关资源
最近更新 更多