TypeError: 'module' object is niet opvraagbaar

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

Waarom krijg ik deze foutmelding? Ik ben in de war.

Wat moet je weten om mijn vraag te beantwoorden?

socket is een module, die de klasse socket bevat.

Je moet socket.socket(...) of from socket import socket doen:

>>> import socket
>>> socket

>>> socket.socket

>>>
>>> from socket import socket
>>> socket

Merk op dat de fout hier vrij gemakkelijk te begrijpen is: als module object is not calllable, roep je waarschijnlijk een module object aan! Wat'is een module object? Het'is het soort ding dat je krijgt als je een module importeert.

Maar zelfs als je dat niet'begrijpt (wat prima is, het'is vaak verwarrend dat klassen, modules, functies etc allemaal gewoon objecten zijn zoals al het andere), er'is een vrij eenvoudige manier om te beginnen met debuggen:

  • "Hmm, module object is niet opvraagbaar. Dat klinkt alsof ik'iets probeer aan te roepen dat je niet kunt aanroepen. Ik vraag me af wat ik probeer aan te roepen? "
  • "Oh, ik'roep socket aan. Dat zou oproepbaar moeten zijn! Ik vraag me af of de variabele socket is wat ik denk dat het is?
  • print socket
Commentaren (8)

Het lijkt erop dat je de socket module hebt geïmporteerd als import socket. Daarom is socket de module. Je moet of die regel veranderen in self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM), net als elk ander gebruik van de socket module, of het import statement veranderen in from socket import socket.

Of je hebt een import socket na je from socket import *:

>>> 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 
TypeError: 'module' object is not callable
Commentaren (4)

Ik weet dat deze draad een jaar oud is, maar het echte probleem zit in je werkdirectory.

Ik geloof dat de werkdirectory C:\Users\Administrator\Documenten\Mibot\oops is. Kijk of u een bestand met de naam socket.py in deze directory kunt vinden. Als u het vindt, hernoem of verplaats het dan. Wanneer je socket importeert, wordt socket.py uit de huidige directory gebruikt in plaats van socket.py uit de directory van Python's. Hopelijk heeft dit geholpen :)

Note: Gebruik nooit de bestandsnamen uit Python's directory om de bestandsnaam van je programma's op te slaan; het zal conflicteren met je programma('s).

Commentaren (1)