Вопрос-Ответ

TypeError: 'module' object is not callable

TypeError: объект 'module' нельзя вызвать
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

Почему я получаю эту ошибку?
Я в замешательстве.

Как я могу решить эту ошибку?

Переведено автоматически
Ответ 1

socket это модуль, содержащий класс socket.

Вам нужно сделать socket.socket(...) или 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'>

Вот что означает сообщение об ошибке:

Оно говорит module object is not callable, потому что ваш код вызывает объект module. Объект module - это тип объекта, который вы получаете при импорте модуля. То, что вы пытались сделать, это вызвать объект class внутри объекта module, который, оказывается, имеет то же имя, что и модуль, который его содержит.

Вот способ логического устранения такого рода ошибок:


  • "module object is not callable. Python сообщает мне, что мой код пытается вызвать что-то, что не может быть вызвано. Что пытается вызвать мой код?"

  • "Код пытается вызвать socket. Это должно быть вызываемым! Является ли переменная socket тем, что я думаю?`

  • Я должен распечатать, что такое сокет, и проверить print(socket)

Ответ 2

Предположим, что содержимое YourClass.py является:

class YourClass:
# ......

Если вы используете:

from YourClassParentDir import YourClass  # means YourClass.py

Таким образом, вы получите TypeError: объект 'module' нельзя вызвать, если вы затем попытаетесь вызвать YourClass().

Но, если вы используете:

from YourClassParentDir.YourClass import YourClass   # means Class YourClass

или используйте YourClass.YourClass(), это работает.

Ответ 3

Добавьте в main __init__.py в YourClassParentDir , например:

from .YourClass import YourClass

Тогда у вас будет готовый экземпляр вашего класса, когда вы импортируете его в другой скрипт:

from YourClassParentDir import YourClass
Ответ 4

Краткий ответ: Вы вызываете файл / каталог как функцию, а не реальную функцию

Читать дальше:

Такого рода ошибка возникает, когда вы импортируете модуль, думая о нем как о функции, и вызываете его. Итак, в python модуль представляет собой файл .py. Пакеты (каталоги) также могут рассматриваться как модули. Допустим, у меня есть create.py файл. В этом файле у меня есть функция, подобная этой:

#inside create.py
def create():
pass

Теперь, в другом файле кода, если мне понравится это:

#inside main.py file
import create
create() #here create refers to create.py , so create.create() would work here

Это выдает эту ошибку, поскольку я вызываю create.py файл как функцию.
итак, я должен сделать это:

from create import create
create() #now it works.
python