Что возвращает Python при создании новых классов? - PullRequest
1 голос
/ 16 декабря 2010

Я нахожу множество причуд с Python при создании нового класса. Я уверен, что это только потому, что я не привык к языку, но даже в этом случае поведение, которое я вижу, действительно странно.

Если я открою iPython и наберу следующее:

class Person:
    def __init__(self, name):
        self.name = name

    def hello(self):
        print "Hello, " + self.name

Все работает точно так, как я ожидал:

In [2]: Person
Out[2]: <class __main__.Person at 0x1c97330>

In [3]: p = Person("Jamie")

In [4]: p
Out[4]: <__main__.Person instance at 0x1c90b98>

In [5]: p.hello()
Hello, Jamie

Однако, если я получу доступ к отдельному классу внутри пакета - я бы добавил, ничего особенного - и создаю новый класс, все пойдет не так. Вот ссылка на код для palestrina / cache.py

In [6]: from palestrina.cache import Cache

In [7]: Cache
Out[7]: <class palestrina.cache.Cache at 0x1c97750>

In [8]: c = Cache(application = 'example', backend = 'filesystem')

In [9]: c
Out[9]: ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/Users/jamierumbelow/Sites/Os/palestrina/<ipython console> in <module>()

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/IPython/Prompts.pyc in __call__(self, arg)
    550 
    551             # and now call a possibly user-defined print mechanism

--> 552             manipulated_val = self.display(arg)
    553 
    554             # user display hooks can change the variable to be stored in


/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/IPython/Prompts.pyc in _display(self, arg)
    576             return IPython.generics.result_display(arg)
    577         except TryNext:
--> 578             return self.shell.hooks.result_display(arg)
    579 
    580     # Assign the default display method:


/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/IPython/hooks.pyc in __call__(self, *args, **kw)
    139             #print "prio",prio,"cmd",cmd #dbg

    140             try:
--> 141                 ret = cmd(*args, **kw)
    142                 return ret
    143             except ipapi.TryNext, exc:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/IPython/hooks.pyc in result_display(self, arg)
    169 
    170     if self.rc.pprint:
--> 171         out = pformat(arg)
    172         if '\n' in out:
    173             # So that multi-line strings line up with the left column of


/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pprint.pyc in pformat(self, object)
    109     def pformat(self, object):
    110         sio = _StringIO()
--> 111         self._format(object, sio, 0, 0, {}, 0)
    112         return sio.getvalue()
    113 

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pprint.pyc in _format(self, object, stream, indent, allowance, context, level)
    127             self._readable = False
    128             return
--> 129         rep = self._repr(object, context, level - 1)
    130         typ = _type(object)
    131         sepLines = _len(rep) > (self._width - 1 - indent - allowance)

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pprint.pyc in _repr(self, object, context, level)
    221     def _repr(self, object, context, level):
    222         repr, readable, recursive = self.format(object, context.copy(),
--> 223                                                 self._depth, level)
    224         if not readable:
    225             self._readable = False

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pprint.pyc in format(self, object, context, maxlevels, level)
    233         and whether the object represents a recursive construct.
    234         """
--> 235         return _safe_repr(object, context, maxlevels, level)
    236 
    237 

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pprint.pyc in _safe_repr(object, context, maxlevels, level)
    318         return format % _commajoin(components), readable, recursive
    319 
--> 320     rep = repr(object)
    321     return rep, (rep and not rep.startswith('<')), False
    322

TypeError: 'bool' object is not callable

Я не могу понять, что здесь происходит. Может кто-нибудь объяснить мне, что может происходить?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Итак, вы удалили соответствующую часть (traceback) и заменили ее на ... в вашей вставке.

Но похоже, у вас есть ошибка в представлении класса.

Вот симуляция ошибки:

>>> class MyClass(object):
...     def __repr__(self):
...         return True()
...
>>> c = MyClass()
>>> c

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

Предоставление исходного кода этого класса также поможет.

1 голос
/ 16 декабря 2010

Не ошибка Python, ваш пакет вызывает проблему.

Вы используете несколько неприятных трюков, чтобы сохранить набор текста. В частности, вы переопределяете специальный метод __getattr__, который используется всякий раз, когда вы пытаетесь получить доступ к атрибуту c. Проверка его будет искать метод __repr__, а методы - это атрибуты, так что ...

Попытка полностью заменить атрибуты вашего класса для удобства - действительно плохая идея. Я думаю, вам было бы лучше сделать это с __getitem__, __setitem__ и __delitem__, поэтому ваш доступ к кешу выглядит как c["name"], а не c.name.

РЕДАКТИРОВАТЬ: Еще один совет, постарайтесь не отлавливать все свои ошибки, если у вас есть вместо этого что-то продуктивное. Если бы вы не ловили ошибки на get() и не превращали их в return False, трассировка показала бы именно то, что она пыталась сделать. А что если я захочу сохранить True или False в кеше? Как я узнаю, что False означает False или «отсутствует значение»?

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