这可能更像一个基于意见的问题,但无论如何我还会继续!
我有许多函数可以从远程设备获取多个值,我需要在进行计算时使用最新的值。作为一个远程设备,我在询问值时必须使用特定于设备的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个以上的特征。
有关如何改进此代码的任何想法?提前谢谢!
校准
答案 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 )