Problem: Methoden-calls & optimierte Dict-Zugrife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

Montag 3. November 2008, 08:13

@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.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Montag 3. November 2008, 10:39

str1442 hat geschrieben:@Funktion-die-ihren-Aufrufer-kennt:
Eine Moeglichkeit waere einfach im Stack nachschauen:

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)]
Also:

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)
Ausgabe:

Code: Alles auswählen

>>> caller()
callee called by caller

>>> callee()
callee called by <module>
Stackposition entsprechend anpassen wenn man einen Dekorator schreibt. Aber das Prinzip bleibt dasselbe.
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Montag 3. November 2008, 11:23

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.).
Hm, meinst du vielleicht sowas?

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
>>> 
hector
User
Beiträge: 20
Registriert: Dienstag 3. Oktober 2006, 09:06

Montag 3. November 2008, 14:28

@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.
Antworten