2016-09-17 62 views
0

我正在开发这个Python项目,我多次遇到这种情况,我想知道是否有更好的方法。避免额外的线路进行属性检查?

有一个类实例的列表。列表的一部分是空的(填写None)。 以下是一个示例列表。

ins_list = [ins_1, ins_2, None, ins_3, None] 

我必须在整个程序流程中做一些确认。有些地方需要控制这些实例的属性。但是从列表中选择一个实例只有索引,它可能是空的元素之一。当调用属性时会出现错误。这是一个示例程序流程。

ind = 2 

if ins_list[ind].some_attribute == "thing": 
    # This would give error when empty element is selected. 

我通过解决这个问题,

if ins_list[ind]: 
    if ins_list[ind].some_attribute == "thing": 
     # This works 

我没关系使用此。然而,该计划是一个长期的计划,我应用了数百次。有没有更容易,更好的方式做到这一点,这意味着我正在生成缩进代码并无故增加缩进级别。我想知道是否有这样的解决方案。

回答

0

有两个选项:

使用词典:

另一种方法是使用dictionary代替。所以你可以创建你的字典,一旦列表中充满了元素。字典的键将是您列表的值,作为值,您可以使用非“None”和“No_attr”的元素的属性作为None的元素。 (注:有记住,Python字典不支持重复键,这就是为什么我提出以下存储作为密钥列表索引否则你必须找到一种方法,使键有所不同)

例如像列表:

l = [item1,item2,None,item4] 

您可以创建一个字典:

d = {item1:"thing1", item2:"thing2", None:"No_attr", item3:"thing3"} 

所以这样你每次都需要做检查的时候,你就不必检查两个条件,但你只能检查值,如:

if d.values()[your_index]=="thing": 

唯一缺点这种方法的是标准Python字典是固有无序,这使得由索引访问字典值有点危险有时 - 你必须要小心,不要改变字典的形式安排。现在

,如果你想确保指数保持稳定,那么你就必须存储它的一些方式,例如选择为键你的字典的的指标,因为你将已经存储项目的属性 - 但是这是你必须决定的东西,并且强烈依赖于你的项目的架构。

使用列表:

在使用list小号的方式,我不认为有一种方法来避免你的if语句 - 而不是坏的实际。也许使用and运算符,因为它在另一个答案中已经提到过,但我认为这没有任何区别。

此外,如果你想使用第一种方法: if ins_list[ind].some_attribute == "thing":

你可以尝试使用和异常捕手这样的:

try: 
    if ins_list[ind].some_attribute == "thing": 
     #do something 
except: 
    #an error occured 
    pass 
+0

'None'必须存在于我的程序列表中。该列表是一个预先确定的数据持有者,其元素被填满并清空。 –

0

使用布尔运算符and

if ins_list[ind] and ins_list[ind].some_attribute == "thing": 
    # Code 
0

提议编码器,你可以从你的列表中删除无,或用字典来代替,以避免必须为每个索引的条目。

我想提出另一种方法:您可以创建一个dummyclass并将其替换为None。这样就没有错误,如果你设置一个属性:设置一个属性

编辑时

class dummy: 
    def __nonzero__(self): 
     return False 
    def __setattr__(self, k, v): 
     return 


mydummy = dummy() 
mylist = [ins_1, ins_2, mydummy, ins_3, mydummy] 

什么都不会被存储到dummyinstances:

如果原始列表的内容不能选择,那么这个类可以帮助:

class PickyList(list): 
    def __init__(self, iterable, dummyval): 
     self.dummy = dummyval 
     return super(PickyList, self).__init__(iterable) 
    def __getitem__(self, k): 
     v = super(PickyList, self).__getitem__(k) 
     return (self.dummy if v is None else v) 



mylist = PickyList(ins_list, mydummy) 
0

在这种情况下,我会使用try-except语句,因为EAFP(比权限更容易要求原谅)。它不会缩短代码,但在检查有效属性时,它是一种更符合Pythonic的编码方式。这样你就不会违背DRY (别自责)

try: 
    if ins_list[ind].some_attribute == "thing": 
     # do_something() 
except AttributeError: 
    # do_something_else()