File "C:\Users\Administrator\Documents\Mibot\oops\blinkserv.py", line 82, in __init__
self.serv = socket(AF_INET,SOCK_STREAM)
TypeError: 'module' object is not callable
Zakaj dobim to napako? Zmotilo me je.
Kaj morate vedeti, da boste odgovorili na moje vprašanje?
socket
je modul, ki vsebuje razred socket
.
Uporabiti morate socket.socket(...)
ali from socket import socket
:
>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>
Opazite, da je tukajšnjo napako precej enostavno razumeti: če objekt modula ni klicljiv
, verjetno kličete objekt modula! Kaj je objekt modula? To je stvar, ki jo dobite, ko uvozite modul.
Toda tudi če tega ne razumete (kar je v redu, saj je pogosto zmedeno, da so razredi, moduli, funkcije itd. samo objekti kot vse drugo), obstaja dokaj preprost način za začetek odpravljanja napak:
objekt modula ni klicljiv
. To zveni, kot da poskušam poklicati nekaj, česar ne moreš poklicati. Zanima me, kaj poskušam poklicati?socket
. To bi moralo biti klicljivo! Zanima me, ali je spremenljivka socket
tisto, kar mislim, da je?print socket
Zdi se, da ste uvozili modul socket
kot import socket
. Zato je modul socket
modul. To vrstico morate spremeniti v self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, kot tudi vsako drugo uporabo modula socket
, ali pa spremeniti izjavo o uvozu v from socket import socket
.
Ali pa imate za ukazom from socket import *
ukaz import socket
:
>>> from socket import *
>>> serv = socket(AF_INET,SOCK_STREAM)
>>> import socket
>>> serv = socket(AF_INET,SOCK_STREAM)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'module' object is not callable
Vem, da je ta nit stara eno leto, vendar je resnična težava v vašem delovnem imeniku.
Menim, da je delovni imenik C:\Users\Administrator\Documents\Mibot\oops\
. Prosimo, preverite, ali je v tem imeniku datoteka z imenom socket.py
. Ko jo najdete, jo preimenujte ali premaknite. Ko uvozite vtičnico, se namesto datoteke socket.py
iz imenika Python uporabi datoteka socket.py
iz trenutnega imenika. Upam, da vam je to pomagalo. :)
Pomnilo: Nikoli ne uporabljajte imen datotek iz Python'ovega imenika za shranjevanje imena datoteke vašega programa; to bo v nasprotju z vašimi programi.