On Mon, Jan 26 2015, Gollum1 wrote:
> Il 26 gennaio 2015 08:08, Gollum1 <gollum1.smeag...@gmail.com> ha scritto:
> > Giorno Lista,
> >
> > oggi sono arrivato presto al lavoro, e visto che nessuno rompe, ho
> > ripreso in mano il mio programmino fermo da parecchio...
> >
> > attraverso il modulo requests riesco ad ottenere una stringa
> > contenente l'XML con tutti i parametri dell'utente loggato alla pagina
> > chiamata da requests.
> >
> > sto usando xml.parsers.expat per analizzarla, e vorrei fare in modo
> > che gli attributi che trovo per i vari tag xml vengano restituiti come
> > dizionario {nome_tag: attributo_uri}
> >
> > ho usato questo codice di esempio:
> > https://docs.python.org/3.4/library/pyexpat.html#example
> >
> > e fino a che nelle prove stampo i tag e gli attributi, tutto va bene,
> > ma come faccio a fare il return di una voce di dizionario?
> >
> > pensavo di mettere:
> >
> >     def start_element(name, attrs):
> >          if 'uri' in attrs.keys():
> >             return{name: attrs['uri']}
> >
> > ma chi è il chiamante effettivo, visto che in realtà è come se io
> > avessi inettato la mia funzione all'interna della classe del parser?
> >
> > Byez
> > --
> > Gollum1 - http://www.gollumone.it
> > Tesssssoro, dov'é il mio tessssoro...
> 
> 
> naturalmente se uso una variabile esternda al def, la cosa funziona,
> 
> urls = dict()
> 
> def start_element(name, attrs):
>     if 'uri' in attrs.keys():
>         urls[name] = attrs['uri']
> 
> 
> personalmente però ho sempre cercato di evitare di usare delle
> variabili "globali" all'interno di definizioni di funzioni...
> 
> se lo faccio solitamente è perché sono comunque all'interno di una
> classe, ma in questo caso non ho necessità di refernziare una nuova
> classe solo per l'analisi di questo file xml, una volta ottenuto
> questi uri non me ne faccio più nulla.
> 
> mi sto facendo troppe pippe per nulla?

La funzione è richiamata dal parser stesso e quindi non puoi utilizzare
il valore returnato. Usare delle variabili globali non è vietato ma puoi
utilizzare altre soluzioni, per esempio i metodi di una funzione.
Infatti questi sono già legati all'oggetto stesso e quindi hanno già uno
stato comune. Ti allego un esempio, abbastanza ridicolo a dire il vero.

m.

from __future__ import print_function


class Parser(object):

    def parse(self, obj):
        if isinstance(obj, list):
            self._parse_list(obj)
        elif isinstance(obj, dict):
            self._parse_dict(obj)
        else:
            self.parse_obj(obj)

    def _parse_list(self, obj):
        self.start_list()
        for el in obj:
            self.start_list_el()
            self.parse(el)
            self.end_list_el()
        self.end_list()

    def _parse_dict(self, obj):
        self.start_dict()
        for k, v in obj.iteritems():
            self.start_dict_key()
            self.parse(k)
            self.end_dict_key()
            self.start_dict_val()
            self.parse(v)
            self.end_dict_val()
        self.end_dict()

    parse_obj = lambda self, obj: None
    start_dict_key = end_dict_key = start_list = end_list = \
            start_list_el = end_list_el = start_dict_val = end_dict_val = \
            lambda self: None


class Handler(object):

    def __init__(self):
        self._list_first = True
        self._dict_first = True

    def start_dict_val(self):
        if self._dict_first:
            self._dict_first = False
        else:
            print(", ", end="")

    def start_list_el(self):
        if self._list_first:
            self._list_first = False
        else:
            print(", ", end="")

    def end_dict_key(self):
        print(": ", end="")

    def start_list(self):
        print("[", end="")

    def end_list(self):
        self._list_first = True
        print("]", end="")

    def start_dict(self):
        print("{", end="")

    def end_dict(self):
        self._dict_first = True
        print("}", end="")

    def parse_obj(self, obj):
        print(repr(obj), end="")


if __name__ == "__main__":
    parser = Parser()
    handler = Handler()
    parser.start_list = handler.start_list
    parser.end_list = handler.end_list
    parser.start_dict = handler.start_dict
    parser.end_dict = handler.end_dict
    parser.parse_obj = handler.parse_obj
    parser.start_dict_val = handler.start_dict_val
    parser.end_dict_key = handler.end_dict_key
    parser.start_list_el = handler.start_list_el
    parser.parse([{"hello": "world"}])
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a