Может ли модуль python иметь __repr__? - PullRequest
5 голосов
/ 13 ноября 2009

Может ли модуль python иметь __repr__? Идея была бы сделать что-то вроде:

import mymodule
print mymodule

РЕДАКТИРОВАТЬ: точность: я имею в виду пользовательский repr!

Ответы [ 5 ]

8 голосов
/ 13 ноября 2009

Краткий ответ : в основном ответ - нет.

Но разве вы не можете найти нужную вам функциональность, используя строки документации?

testmodule.py
""" my module test does x and y
"""
class myclass(object):
    ...
test.py
import testmodule
print testmodule.__doc__

Длинный ответ:

Вы можете определить свой собственный __repr__ на уровне модуля (просто укажите def __repr__(...), но тогда вам придется сделать:

import mymodule
print mymodule.__repr__() 

чтобы получить желаемую функциональность.

Посмотрите на следующую сессию оболочки Python:

>>> import sys                 # we import the module
>>> sys.__repr__()               # works as usual
"<module 'sys' (built-in)>"
>>> sys.__dict__['__repr__']     # but it's not in the modules __dict__ ?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: '__repr__'
>>> sys.__class__.__dict__['__repr__'] # __repr__ is provided on the module type as a slot wrapper
<slot wrapper '__repr__' of 'module' objects>
>>> sys.__class__.__dict__['__repr__'](sys) # which we should feed an instance of the module type
"<module 'sys' (built-in)>"

Поэтому я считаю, что проблема заключается в этих объектах-обертках слотов , которые (из того, что можно прочитать по ссылке) имеют результат обхода обычного 'python' способа поиска атрибутов элементов.

Для этих методов класса CPython возвращает C-указатели на соответствующие методы этих объектов (которые затем оборачиваются в объекты-обертки слотов, чтобы их можно было вызывать со стороны Python).

4 голосов
/ 13 ноября 2009

Вы можете добиться этого эффекта - , если вы готовы обратиться к Темной стороне Силы.

Добавьте это к mymodule.py:

import sys

class MyReprModule(mymodule.__class__):
  def __init__(self, other):
    for attr in dir(other):
      setattr(self, attr, getattr(other, attr))

  def __repr__(self):
    return 'ABCDEFGHIJKLMNOQ'

# THIS LINE MUST BE THE LAST LINE IN YOUR MODULE
sys.modules[__name__] = MyReprModule(sys.modules[__name__])

О чудо:

>>> import mymodule
>>> print mymodule
ABCDEFGHIJKLMNOQ

Я смутно помню, что в предыдущих попытках подобных злых хакеров возникли проблемы при установке специальных атрибутов, таких как __class__. У меня не было таких проблем при тестировании. Если вы столкнулись с этой проблемой, просто перехватите исключение и пропустите этот атрибут.

4 голосов
/ 13 ноября 2009

Модули могут иметь функцию __repr__, но она не вызывается при получении представления модуля.

Так нет, ты не можешь делать то, что хочешь.

2 голосов
/ 13 ноября 2009

На самом деле, многие модули имеют [1001 *]!

>>> import sys
>>> print(sys)
<module 'sys' (built-in)>    #read edit, however, this info didn't come from __repr__ !

также попробуйте dir(sys), чтобы увидеть __repr__ там вместе с __name__ и т.д ..

Редактировать :
__repr__, кажется, находится в модулях, в Python 3.0 и выше.
Как указывает Нед Батчелдер, этот метод не используется Python при печати модуля. (Быстрый эксперимент, в котором свойство repr было переназначено, показал, что ...)

1 голос
/ 13 ноября 2009

Нет, потому что __repr__ - это специальный метод (я называю это способность ), и он только когда-либо просматривался в классе. Ваш модуль - это просто еще один экземпляр типа модуля, поэтому, как бы вы ни определяли __repr__, он не будет вызван!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...