2011-01-15 8 views
3

Ich arbeite mit Neo4j Graph Datenbank, und möchte eine der aktuellen REST-Bibliotheken anpassen. Stellen Sie sich einen Fall mit einer Datenbank mit 20 Knoten vor.Kann eine Python-Liste erstellt und gefälscht werden?

>>> db = Database("http://localhost:7474") 

ich die API wie möglich zu sein, so einfach haben möchten, so dass es möglich wäre, den 14. Knoten mit etwas Ähnliches wie dieses zu erhalten:

>>> db[14] 

In Neo4j, jeder Knoten ein numerische Taste. Das bedeutet, dass db[14] sehr schön auf http://localhost:7474/db/data/node/14 abgebildet wird. Ich möchte jedoch nicht jeden Knoten aus der Datenbank in das Objekt db laden. Mein bevorzugtes Verhalten besteht darin, Knoten 14 nachzuschlagen und einen Indexfehler auszulösen, wenn der Wert in der Datenbank nicht existiert. Das heißt, ich möchte, dass das Objekt db leer ist, aber vorgibt, einen Wert zu haben.

Ist es möglich, etwas herzustellen, das aussieht wie ein list, aber verhält sich deutlich anders?

+0

"Mein bevorzugtes Verhalten ist, Knoten 14 nachzuschlagen und einen IndexError auszulösen, wenn der Wert in der Datenbank nicht existiert. Das heißt, ich möchte, dass das DB-Objekt leer ist, aber vorgibt, einen Wert zu haben." Wie verhält sich das so, als hätte es einen Wert? Sie erhöhen indexError, also gibt es nicht vor, ein vaule zu haben ... –

+0

Vielleicht ist das schlecht ausgedrückt. Wenn Sie so tun, als hätten Sie einen Wert, dann tun Sie so, als hätten Sie etwas im Gedächtnis. –

Antwort

10

Ja, Sie können eine benutzerdefinierte Klasse schreiben, die __getitem__ implementiert und dynamisch ein Ergebnis generiert.

>>> class MyDatabase(object): 
...  def __getitem__(self, x): 
...   if 10 <= x <= 15: 
...    return "foo" 
...   else: 
...    raise IndexError('key not in database') 
... 
>>> db = MyDatabase() 
>>> db[12] 
foo 

Weitere Informationen finden Sie unter Special method names.

+0

Thanks Mark - Ich ging davon aus, dass es eine der doppelten Unterstreichungsmethoden überschrieben hat. –

+0

Ich würde hinzufügen, dass jeder eingebaute Python-Typ eine "Schnittstelle" implementiert, die dokumentiert ist. Sie können fast alle eingebauten Typen mit den Funktionen namens "__etwas" vortäuschen. –

+0

@ADrien: Ich glaube nicht, dass "Fake" hier ein passendes Wort ist. Wenn Sie Anthere-Typ erstellen, gleich gut, ist es nicht "falsch". – jsbueno

Verwandte Themen