Vinnaren i pepparkakshustävlingen!
2011-08-19, 22:39
  #1
Medlem
Ideriks avatar
Jag försöker att experimentera med Eventhooks. Men jag behöver att definera och kalla på ganska många olika events och nu börjar det ta ganska stor plats i min kod. Det jag gör, är att jag måste först deklarera en event och sedan definera vad som ska trigga denna event (blanda inte ihop det med vad eventen kommer att kalla, när väl den har blivit triggad).
Det som triggar mina events är olika paket som en klient skickar, för att kunna trigga olika events med olika paket, krävs ett protokoll, det är här koden börjar bli stor. Jag måste alltså både deklerera event för att sedan göra samma i protokollet. Jag skulle vilja göra båda dom i ett och samma svep.

Här är ett kodexempel:

Tänk er, att om jag lägger till 100 events extra, då kommer koden att bli minst dubbelt så lång, eftersom en event måste deklareras (self.onClientAdd = Event()) för att sedan läggas in i protokollet ("clientAdd":self.onClientAdd).

Förslag: Om jag på något vis skulle kunna ha protokollet i en fil som skriptet sedan läser in. Skriptet loopar igenom alla pakettyper och får varsin event, sedan borde jag kunna skapa en dictionary som ska vara protokollet som ReadPacket använder. Jag har försökt och försökt, men hittar ingen utväg.

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

Tacksam för ä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 löst. Jag använde mig utav "vars()" som kan skapa variabelnamn under körning av programmet.

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

Den här funktionen hämtar en lista från en fil och skapar en variabel för varje föremål i listan som sedan defineras med en event klass, här ändrar jag lite på variabelnamnet genom att lägga 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å här använder skriptet:
Kod:
# Här är funktionen som ska kallas när min "clientAdd"-event triggas.
def ClientHasBeenAdded():
  print "Client has been added!"

# Ladda in alla events, sen är det bara att börja "hooka" dom till funktioner.
# Vi låtsas att innehållet av filen ser ut så här: "clientAdd\nclientRemove\nclientPing"
Read.LoadProtocol("Data/protocol.cfg")

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

# Vi oss säga att vi får ett "clientAdd"-nätverkspaket
Read.Route("clientAdd")

# OUTPUT: Client has been added!

Otroligt litet och användbart skript, speciellt om du ska skapa ett API. Här återskapar vi C#-språkets bästa funktion i Python med endast ett par rader, då menar jag eventklassen. Kärleken till Python ökar varje dag!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback