2013-08-22 34 views
0

我有一個數組row。我想將對象actor的一組屬性添加到數組中。但是,並不是所有的角色都具有每個屬性。Python:循環有可能的屬性錯誤

我想運行一個循環,如果它存在將會添加屬性,但如果不存在則添加'none'

我似乎無法找到一種方法來做循環中的測試,使用tryhasattr。這是我得到的。當然,這是行不通的,因爲這些屬性是在循環之外被引用的:

for attribute in [actor.x, actor.y, actor.parent, actor.force, actor.hunger, actor.size]: 
    try: 
     row.append(attribute) 
    except AttributeError: 
     row.append('none') 

什麼是最好的方式去做這件事?

+0

爲什麼所有演員不具有相同的屬性?對我來說,聽起來好像你的生活可能會更容易,如果所有的演員都繼承了同一個對象,並且如果一個特定的演員不具有.force,那麼分配self.force = None。 '特殊情況不足以違反規則。' – TehTris

+0

爲了擴展TehTris的問題:你想達到什麼目的?把屬性扔進一個列表似乎是一種很好的方式來丟失信息並獲得我不知道的東西。 – msw

+0

或者,也許「演員」根本不應該是一個對象(或稱爲組件或命名空間或其他),而應該是一本字典。或者,也許是一個單一的'屬性'成員是一個字典的對象。 – abarnert

回答

4
for attribute in ['x', 'y', 'parent', 'force', 'hunger', 'size']: 
    row.append(getattr(actor, attribute, 'none')) 

getattr有一個可選的第三個參數爲如果對象不具有屬性設置一個缺省值。

一些說明在這裏:

爲什麼這些演員中的一些缺少屬性?他們是否應該有'none'None或其他一些默認值?

由於隱式字符串連接,字符串列表容易出現錯誤。如果你沒有使用這個工具,那麼這是獲取毛髮工具的很多好理由之一。

您確定要'none'作爲默認值嗎?使用None可能更有意義,或者預期屬性的類型爲零。 (如果他們預計是字符串,'none'可能是有意義的。)

+0

+1,但我會建議'None'作爲哨兵值,因爲'bool('none')'→True其中'bool(None)'→False – msw

+1

@msw:擴展我的答案。 – user2357112

+0

@ user2357112,演員缺少屬性,因爲演員是許多子類的父類。沒有演員實例也不是子類。預計它們是字符串;這是一個日誌功能的一部分,它將一系列角色輸出爲CSV。感謝您的意見和建議,反饋是肯定讚賞。 –