string is not callable

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.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

string is not callable

Beitragvon murph » Donnerstag 13. Juli 2006, 10:45

Code: Alles auswählen

def main():
    while True:
        print "Waiting for Datas"
        _tmplist, usr_addr = connection.get_rcv_udpsock().recvfrom(buf)
        ql = cPickle.loads(_tmplist) #ql = questionlist
        print "!!!",ql,"!!!"
        if ql[0] == 'execute':
            ql[0] == execute 
        elif ql[0] == 'login':
            ql[0] == login
        elif ql[0] == 'logout':
            ql[0] == logout
        elif ql[0] == 'change_pw':
            ql[0] == change_pw
        elif ql[0] == 'del_user':
            ql[0] == del_user
        elif ql[0] == 'add_user':
            ql[0] == add_user
        elif ql[0] == 'reset':
            ql[0] == reset
        else:
            print "non-dic received!"
            raise SystemExit
        qlen = len(ql)
        if qlen==2:
            returned = ql[0](ql[1])
        elif qlen == 3:
            returned = ql[0](ql[1],ql[2])
        elif qlen == 4:
            returned = ql[0](ql[1],ql[2],ql[3])
        else:
            raise SystemExit
        print "Executed datas ("+returned+")"

        sendpickled(usr_addr, returned)


murph@murphs:~/own_project$ ./sqliteserver.py
Waiting for Datas
Traceback (most recent call last):
File "./sqliteserver.py", line 247, in ?
main()
File "./sqliteserver.py", line 238, in main
returned = ql[0](ql[1],ql[2])
TypeError: 'str' object is not callable

ich verstehe das nicht...ql[0] ist kein string und ein anderer part wird nicht geprintet! wieso nicht? der part muss doch geprintet werden, bevor die funnction ausgeführt wird.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Donnerstag 13. Juli 2006, 11:03

Um etwas zuzuweisen brauchst du nur ein Gleichheitszeichen und nicht 2.

Code: Alles auswählen

ql[0] = login


nicht

Code: Alles auswählen

ql[0] == login


Gruss
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Donnerstag 13. Juli 2006, 16:01

:oops: :oops: habe nicht beachtet, was ich geschrieben hatte :oops: :oops:
BlackJack

Re: string is not callable

Beitragvon BlackJack » Freitag 14. Juli 2006, 07:42

Die ganzen ``elif``\s kann man übrigens loswerden wenn man ein dictionary benutzt. Ohne die ganzen Abfragezweige und Indexe in `ql` sieht's gleich ein wenig übersichtlicher aus:

Code: Alles auswählen

def main():
    while True:
        print "Waiting for Datas"
        _tmplist, usr_addr = connection.get_rcv_udpsock().recvfrom(buf)
        ql = cPickle.loads(_tmplist) #ql = questionlist
        print "!!!",ql,"!!!"
        commands = {'execute': execute,
                    'login': login,
                    'logout': logout,
                    'change_pw': change_pw,
                    'del_user': del_user,
                    'add_user': add_user,
                    'reset': reset }
        try:
            command = commands[ql[0]]
        except KeyError:
            sys.exit('unknown command')
       
        if not 2 <= len(ql) <= 4:
            sys.exit('wrong number of arguments')
       
        returned = command(*ql[1:])
        print "Executed datas ("+returned+")"

        sendpickled(usr_addr, returned)


Was ich noch fragen wollte: Dir ist klar, das UDP unzuverlässig ist? Die Pakete müssen nicht ankommen, die können einfach so verloren gehen. Passiert sogar in LANs ab und zu.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Freitag 14. Juli 2006, 12:14

DANKE!
nach so etwas wie *ql[1:] habne ich die ganze Zeit gesucht!
ich dachte aber zu UDP, dass es relativ zuverlässig wäre, nur sehr selten den dienst aufgeben würde...
ich werde, denke ich mal, aber immer erst für ein release auf tcp umsteigen,
weil UDP einfach nicht sockets blockiert, wenn da was abgestürzt ist :-)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder