@hector: Es ist nicht nur magisch, sondern schränkt IMHO auch zu sehr ein, weil man den "Koordinator" dann nur von einem KI-Objekt aus aufrufen kann. Das KI-Objekt kann seine Strategien dann nicht in weiteren Objekten kapseln, oder den Aufruf des Koordinators über eine Hilfsfunktion in einem anderen Modul machen.
Was die Sicherheit angeht, müsstest Du die KIs sowieso vom Koordinator über eigene Prozesse trennen und die zum Beispiel über XMLRPC kommunizieren lassen.
Problem: Methoden-calls & optimierte Dict-Zugrife
Eine Moeglichkeit waere einfach im Stack nachschauen:str1442 hat geschrieben:@Funktion-die-ihren-Aufrufer-kennt:
Code: Alles auswählen
>>> import traceback
>>> def caller():
... callee()
...
>>> def callee():
... print traceback.extract_stack()
...
>>> caller()
[('<stdin>', 1, '<module>', None), ('<stdin>', 2, 'caller', None), ('<stdin>', 2, 'callee', None)]
Code: Alles auswählen
import traceback
def caller():
callee()
def callee():
thestack = traceback.extract_stack()
callee_name = thestack[-1][2]
caller_name = thestack[-2][2]
print "%s called by %s" % (callee_name, caller_name)
Code: Alles auswählen
>>> caller()
callee called by caller
>>> callee()
callee called by <module>
Hm, meinst du vielleicht sowas?hector hat geschrieben:Hy,
da ich nicht weiss wie ich das, was ich suche in einen vernuenftigen Suchbegriff wandle, muss ich leider euch fragen.
Man stelle sich vor es gibt eine Methode, die ausgeben soll, wer sie aufruft. Derzeit lasse ich das Objekt, was die Methode aufruft noch sich selbst mit uebergeben. Das ist aber sehr haesslich und kann sehr schnell unterwandert werden (einfach eine andere Objektadresse herausfinden und diese uebergeben z.B.).
Code: Alles auswählen
class members:
__id = {}
def _check_id(self):
if members.__id.get(self,False):
return members.__id[self],id(self)
else: raise Exception
def _anmelden(self,name):
members.__id.update({self:name})
return True
def _abmelden(self):
if members.__id.get(self,False):
del members.__id[self]
return True
else:
return False
class bar_besuch(members):
def einlass(self):
try:
mid = self._check_id()
print "Komm rein %s: %s" %(mid[0],mid[1])
except: print "Draussen bleiben: Anonymous"
>>> person1=bar_besuch()
>>> person2=bar_besuch()
>>> person1._anmelden('Qubit')
True
>>> person1.einlass()
Komm rein Qubit: 22725616
>>> person2.einlass()
Draussen bleiben: Anonymous
>>> person1._abmelden()
True
>>> person1.einlass()
Draussen bleiben: Anonymous
>>>
@BlackJack:
Ist schon richtig das mit XMLRPC zu trennen, sowas in der Art schwebte mir da auch vor. Aber jetzt mach ichs eben so, um schneller was in der Hand zu haben. Da ich mich noch nicht entschieden habe, wie es im Gesamten einmal ablaufen soll, implementiere ich vorerst nur das was ich brauche.
@farid: interessanter Hinweis, liefert aber nicht das was ich gerne gehabt haette..
<ki_ant.KI_ant instance at 0x2b2649071878> <-- sowas brauche ich
@Qubit:
Deine Loesung muss ich mir in Ruhe ansehen, aber danke dennoch fuer den Vorschlag.
Ist schon richtig das mit XMLRPC zu trennen, sowas in der Art schwebte mir da auch vor. Aber jetzt mach ichs eben so, um schneller was in der Hand zu haben. Da ich mich noch nicht entschieden habe, wie es im Gesamten einmal ablaufen soll, implementiere ich vorerst nur das was ich brauche.
@farid: interessanter Hinweis, liefert aber nicht das was ich gerne gehabt haette..
<ki_ant.KI_ant instance at 0x2b2649071878> <-- sowas brauche ich
@Qubit:
Deine Loesung muss ich mir in Ruhe ansehen, aber danke dennoch fuer den Vorschlag.