2011-08-19, 22:39
  #1
Medlem
Ideriks avatar
Jag frsker att experimentera med Eventhooks. Men jag behver att definera och kalla p ganska mnga olika events och nu brjar det ta ganska stor plats i min kod. Det jag gr, r att jag mste frst deklarera en event och sedan definera vad som ska trigga denna event (blanda inte ihop det med vad eventen kommer att kalla, nr vl den har blivit triggad).
Det som triggar mina events r olika paket som en klient skickar, fr att kunna trigga olika events med olika paket, krvs ett protokoll, det r hr koden brjar bli stor. Jag mste allts bde deklerera event fr att sedan gra samma i protokollet. Jag skulle vilja gra bda dom i ett och samma svep.

Hr r ett kodexempel:

Tnk er, att om jag lgger till 100 events extra, d kommer koden att bli minst dubbelt s lng, eftersom en event mste deklareras (self.onClientAdd = Event()) fr att sedan lggas in i protokollet ("clientAdd":self.onClientAdd).

Frslag: Om jag p ngot vis skulle kunna ha protokollet i en fil som skriptet sedan lser in. Skriptet loopar igenom alla pakettyper och fr varsin event, sedan borde jag kunna skapa en dictionary som ska vara protokollet som ReadPacket anvnder. Jag har frskt och frskt, men hittar ingen utvg.

Eventklassen: http://paste.pound-python.org/show/11264/
Kodexemplet (med frg! ): http://paste.pound-python.org/show/11265/

Tacksam fr ven de minsta tipsen!
__________________
Senast redigerad av Iderik 2011-08-19 kl. 22:44.
Citera
2011-08-20, 14:58
  #2
Medlem
Ideriks avatar
Ja, d var problemet lst. Jag anvnde mig utav "vars()" som kan skapa variabelnamn under krning av programmet.

Ett exempel med vars:
Kod:
vars()["myVar"] = "myValue"
print myVar
# OUTPUT: myValue

Den hr funktionen hmtar en lista frn en fil och skapar en variabel fr varje freml i listan som sedan defineras med en event klass, hr ndrar jag lite p variabelnamnet genom att lgga till "on" och stor bokstav:
Kod:
	
import event

class Read:
  def LoadProtocol(self, filePath):
    stream = open(filePath, "r")
    data = stream.read().splitlines()
    stream.close()
    for key in data:
      self.protocol[key] = vars(self)["on%s%s" % (key[:1].upper(), key[1:])] = Event()

# Leta igenom protokollet och sedan kalla funktionen om den existerar
def Route(self, key):
self.protocol.get(key, None)

S hr anvnder skriptet:
Kod:
# Hr r funktionen som ska kallas nr min "clientAdd"-event triggas.
def ClientHasBeenAdded():
  print "Client has been added!"

# Ladda in alla events, sen r det bara att brja "hooka" dom till funktioner.
# Vi ltsas att innehllet av filen ser ut s hr: "clientAdd\nclientRemove\nclientPing"
Read.LoadProtocol("Data/protocol.cfg")

# Rikta/Styra/Routa/Hooka ett event till din funktion
Read.onClientAdd += ClientHasBeenAdded

# Vi oss sga att vi fr ett "clientAdd"-ntverkspaket
Read.Route("clientAdd")

# OUTPUT: Client has been added!

Otroligt litet och anvndbart skript, speciellt om du ska skapa ett API. Hr terskapar vi C#-sprkets bsta funktion i Python med endast ett par rader, d menar jag eventklassen. Krleken till Python kar varje dag!
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in