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

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.
http://www.cs.unm.edu/~dlchao/flake/doom/
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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:

:oops: :oops: habe nicht beachtet, was ich geschrieben hatte :oops: :oops:
http://www.cs.unm.edu/~dlchao/flake/doom/
BlackJack

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:

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 :-)
http://www.cs.unm.edu/~dlchao/flake/doom/
Antworten