Lawrence Oluyede ha scritto:
Mi scrivi 5 righe della parte Python di gestione della roba JS con la
tua libreria?
ti posto in fondo tutta la libreria .. che è ancora alpha e non è completa, ha diversi buchi, ma tutto sommato comincia a funzionare




Non trovo un motivo valido per avere questa caratteristica
sinceramente, magari mi sbaglio
esporti classi che hanno metodi utili per il JS
da JS usi queste classi, le istanzi, sfrutti gli oggetti già definiti dalla lib e per ogni oggetto hai già i metodi e per ogni metodo i tre metodi call, result, progress, puoi usarli tutti o nessuno Questa è la parte che interessa il primo invio poi questi oggetti, visto che hai esportato delle classi presenti con il methodTable, puoi usarli sul client o sul server perchè sono già presenti, il caso di oggetti non presenti e creati runtime è molto particolare e sono un pò stanco per spiegarlo bene.




E' troppo perchè sono varie funzioni.
appunto, io vorrei avere tutto disponibile subito


Quindi scrivi una lib in Python per risolvere un problema che ha solo
quella schifezza di PHP?
ho già risposto a questa domanda, scrivo una lib che non è per l'uno o per l'altro, ma che per avere senso a livello di portabilità del client deve basarsi o su JSON o su PHP_Serializer, io ho scelto la seconda per rispetto del predominante nel web, PHP



Interazione avanzate in AJAX?
si, se AHAH è l' abc , con altre lib puoi fare interazioni più complesse, quindi più avanzate




> callRemote("sayHello").addCallback(function(str) {alert(str)})
la callback semplifica ? callRemote è una sola funzione ?
devo farne una per ogni tipo di callRemote ??? .... e quando ti passa a te ?

Che vuol dire tipo di callRemote? La callRemot chiama una funzione e
piglia il valore di ritorno. Che c'è da riscrivere?
niente, avevo capito male ... però questo non è un approccio procedurale ?
io preferirei
myClassVar.sayHello.call();

e nel frattempo hai anche un'istanza di classe da gestire come vuoi



Tutto su che?
u ... unicode


L'hai detto tu che non usi JSON perchè non c'è una libreria in PHP
decente preinstallata. Tra l'altro non avrai lo stesso problema di
deployment con la tua libreria rispetto a quelle più performanti per
PHP ma non preinstallate?
molto meno, per il semplice fatto che non ci sono caratteri da modificare, solo length da sfruttare. La serializzazione / unserializzazione di PHP è molto più semplice di quella json, sia in conversione che in riconversione, Python e C# se la cavano bene anche senza moduli dedicati. Il problema della length per UTF-8, come ho detto, è pià per portabilità della classe PHP_Serializer che altro, perchè trattando stringhe come text (numero dei caratteri), non è necessario usare
UTF-8 con altri linguaggi diversi dal PHP, quindi è molto rapida.

Anzi ... a dirla tutta, in PyRex le uniche reali ottimizzazioni sono proprio per la __slen, che se "inusata", potrebbe avere poco senso di esistere.


Non è un partito preso, è un non reinventare la ruota
infatti non l'ho reinventata, l'ho solo aggiustata (male, datemi tempo)


La tua lib in pyrex sarà ancora meno portabile sui server che non
preinstallano le librerie JSON in PHP performanti, vero?
come sopra








ACE.py
import types, re, PHP_Serializer

HAND_RULES = {
   "DEBUG"    :False,
   "UTF8"    :False,
   "GZ"    :False
}


def in_list(value, values):
   result = False
   for i in range(0, len(values)):
       if value == values[i]:
           result = True
           break
   return result

class ACE:
php = None # PHP_Serializer
   utf8 = False        # is UTF8 enabled or not
   next = True        # has any error
   gz = False        # uses gz compression
   dodebug = False        # creates a debug file
   debug = []        # debug informations
   types = {        # valid variable types
"s":"string", "N":"null", "O":"Class", "b":"boolean", "i":"integer", "d":"float", "a":"array", "u":"undefined"
   }
def __init__(self, settings):
       self.utf8 = settings["UTF8"]
       self.dodebug = settings["DEBUG"]
       self.gz = not self.dodebug and settings["GZ"]
       self.php = PHP_Serializer.PHP_Serializer(self.utf8)
def getMethods(self, classDict):
       tmp = None
       result = []
if classDict.has_key("methodTable") and type(classDict["methodTable"]) is types.DictType:
           for key in classDict["methodTable"]:
               tmp = classDict["methodTable"][key]
if type(tmp) is types.DictType and (not tmp.has_key("access") or tmp["access"] == "remote"):
                   result.append(key)
       return result
def getMethodInformations(self, tmpclass, method):
       i = 0
       result = {}
       vars = tmpclass.__class__.__dict__["methodTable"][method]
       if vars.has_key("arguments") and type(vars["arguments"]):
           result = {"info":[], "required":0}
           if type(vars["arguments"]) is types.ListType:
               for key in range(0, len(vars["arguments"])):
result["info"].append({"type":self.parseType(vars["arguments"][key]),"required":self.isRequired(vars["arguments"][key])})
           elif type(vars["arguments"]) is types.DictType:
               for key in vars["arguments"]:
result["info"].append({"type":self.parseType(vars["arguments"][key]),"required":self.isRequired(vars["arguments"][key])})
           if result["info"][i]["required"]:
               result["required"] = result["required"] + 1
           i = i + 1
       return result

   def parseType(self, value):
       result = "u"
       if value.has_key("type"):
           result = value["type"].lower()
           if result == "string":
               result = "s"
           elif result == "int" or result == "integer":
               result = "i"
           elif result == "null" or result == "none":
               result = "N"
           elif result == "class" or result == "object":
               result = "O"
           elif result == "bool" or result == "boolean":
               result = "b"
elif result == "array" or result == "list" or result == "dict" or result == "tuple":
               result = "a"
elif result == "float" or result == "double" or result == "long":
               result = "d"
       return result

   def isRequired(self, value):
       result = False
       if value.has_key("required"):
           result = value["required"]
       return result

   def goodRequestVariable(self, settings, i, post, hasinfo):
       if self.next:
           self.next = len(post) > 0
       if self.next and hasinfo and settings["info"].has_key(i):
if post[0] != settings["info"][i]["type"] and settings["info"][i]["type"] != "u":
               if self.dodebug:
self.debug.append("Variable #" + str(i + 1) + ' of type ' + self.types[settings["info"][i]["type"]] + " is not defined or is not correct: " + post)
               self.next = False
       return self.next

   def callClassMethod(self, className, method, _POST):
       i = 0
       istring = "_0"
       hasinfo = False
       args = settings = methodInfo = []
       vars = {}
       tmpclass = self.getClass(className)
       if(tmpclass != None):
if in_list(method, self.getMethods(tmpclass.__class__.__dict__)):
               vars = self.getMethodInformations(tmpclass, method)
if vars["required"] == 0 or _POST.has_key("_" + str((vars["required"] - 1))): while _POST.has_key(istring) and self.goodRequestVariable(vars, i, _POST, hasinfo):
                       if self.dodebug:
methodInfo.append("args[" + str(i) + "] = " + _POST[istring])
                       args.append(self.unserialize(_POST[istring]))
                       i = i + 1
                       istring = "_" + str(i)
                   if self.next:
                       settings = []
                       i = len(args)
                       for i in range(0, len(args)):
                           settings.append("args[" + str(i) + "]")
                       method = method + "(" + ",".join(settings) + ")"
exec "istring=self.php.serialize(tmpclass." + method + ")"
                       if self.dodebug:
method = method + "<br />" + "<br />".join(methodInfo)
                   elif self.dodebug:
self.debug.append("ACE has killed itsself, bye bye.")
               elif self.dodebug:
                   while _POST.get("_" + i, None) != None:
                       i = i + 1
self.debug.append(method + " method requires at least " + vars["required"] + " params and not " + i)
           elif self.dodebug:
self.debug.append("Choosed method is not availbale: " + method)
       elif self.dodebug:
self.debug.append("Choosed Class or method is not valid: " + className + "." + method)
       if not self.next:
           istring = ""
       return istring
def exportClass(self, className):
       result = settings = []
       tmpclass = self.getClass(className)
       if tmpclass != None:
           settings = self.getMethods(tmpclass.__class__.__dict__)
           for i in range(0, len(settings)):
               result.append(settings[i])
       elif self.dodebug:
           self.debug.append("Class " + className + " is not valid")
       return result
def getClass(self, className):
       classExists = None
       try:
           exec "import " + className
           classExists = eval(className + "." + className + "()")
       except:
           classExists = None
       return classExists
def unserialize(self, post):
       result = None
       try:
           result = self.php.unserialize(post)
       except:
           if self.dodebug:
self.debug.append("Unserialize Exception [utf8: " + str(self.utf8) + "] with this var: " + pos)
           self.next = False
       return result;
ace = ACE(HAND_RULES)
_POST = {"_0":"s:4:\"ace!\";"}
print ace.exportClass("MyClass")
ace.callClassMethod("MyClass", "hello", _POST)




MyClass.py
class MyClass:
methodTable = {
       "hello":{"access":"remote",
            "arguments":[{
               "type":"string",
               "required":True
           }]}
       }
def hello(self, str):
       print str



Devo ancora lavorarci sopra ... anche e soprattutto per l'import dinamico (ogni consiglio è bene accetto)
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a