2016-03-19 4 views
1

Als ich meinen Code für ein Problem schrieb, trat dieser Fehler auf: wenn ich mein Objekt klar definiert hatte.Objekte an eine Liste anfügen; Das Ausführen der Funktion gibt Attributfehler

Mein Code sieht in etwa wie folgt aus:

#Assuming that someObject has method "someMethod" 
otherList = [] 
for someObject in listOfObjects: 
    if someObject.someMethod() != True: 
     otherList.append(someObject) 
+0

Wie instanziieren Sie Ihre 'listOfObjects'? –

+2

Es hat nichts mit 'append' Methode zu tun, Sie haben eine' None' in Ihrer 'listOfObjects' – Selcuk

+0

Sie haben Recht. Danke vielmals! –

Antwort

0

Wie @Selcuk bereits erwähnt Sie eine None in Ihrem listOfObjects haben. Um diesen Fall zu fangen können Sie überprüfen, ob sie diese Methode haben unter Verwendung von:

#Assuming that someObject has method "someMethod" 
otherList = [] 
for someObject in listOfObjects: 
    if getattr(someObject, 'someMethod', lambda : True)() != True: 
     otherList.append(someObject) 

getattr werden versuchen, das Verfahren zu bekommen, und wenn es keine solche Methode hat, wird es eine Funktion zurück, die True zurück, wenn genannt. Eine Alternative ist es gerade diese Ausnahmen zu fangen:

#Assuming that someObject has method "someMethod" 
otherList = [] 
for someObject in listOfObjects: 
    try: 
     if someObject.someMethod() != True: 
      otherList.append(someObject) 
    except AttributeError(): 
     # Catch the Error but just let it go, we wouldn't want to append it. 
     pass 

als einfach beiseite, wenn Sie wissen gibt es kein solches Problem mit None in der Liste gibt es eine schöne Alternative zu der Schleife:

import itertools 
import operator 
otherList = list(itertools.filterfalse(operator.methodcaller('someMethod'), listOfObjects)) 

könnte sein, dass Sie filterfalse von ifilterfalse mit python2

ersetzen müssen Auch wenn es nur die Elemente behalten wird, die False zurückgeben und nicht wie Sie != True angegeben haben, aber ich dachte, dass es eine nette Alternative ist, wenn man bedenkt, dass die Itertools und der Operator schneller als normale Iterationen sind.

Verwandte Themen