Вызываемые модули

Почему Python не позволяет __call__ иметь __call__ ? (Помимо очевидного, что его было бы непросто импортировать напрямую.) В частности, почему синтаксис a(b) не использует атрибут __call__ как для функций, классов и объектов? (Является ли поиск просто несовместимым для модулей?)

 >>> print open("mod_call.py").read() def __call__(): return 42 >>> import mod_call >>> mod_call() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'module' object is not callable >>> mod_call.__call__() 42 

  • Ошибка путаницы Python
  • Не удалось обновить пакет python six в mac osx 10.10.2
  • Calltips / Docstring во время просмотра списка функций?
  • Предотвращение выключения Windows из python
  • Доступ к стандартным выводам подпроцесса в python
  • Подпись под заголовком Python для сообщения S3
  • Python: Как мне форматировать дату в Jinja2?
  • Как удалить список строк из фреймворка Pandas?
  • 2 Solutions collect form web for “Вызываемые модули”

    Специальные методы гарантируются, что они неявно называются неявно, когда они определены в типе, а не в экземпляре. ( __call__ – это атрибут экземпляра модуля mod_call , а не <type 'module'> .) Вы не можете добавлять методы к встроенным типам.

    http://docs.python.org/reference/datamodel.html#special-method-lookup-for-new-style-classes

    Python не позволяет модулям переопределять или добавлять какой-либо магический метод, потому что сохранение объектов модуля простым, регулярным и легким просто слишком выгодно, учитывая, как редко появляются сильные примеры использования, где вы можете использовать магические методы.

    Когда такие примеры использования появляются, решение состоит в том, чтобы сделать экземпляр класса masquerade как модуль. В частности, введите код mod_call.py следующим образом:

     import sys class mod_call(object): def __call__(self): return 42 sys.modules[__name__] = mod_call() 

    Теперь ваш код, импортирующий и вызывающий mod_call отлично работает.

    Python - лучший язык программирования в мире.