2010-12-16 5 views
1

Я нахожу множество причуд с Python при создании нового класса. Я уверен, что это просто потому, что я не привык к языку, но даже в этом случае поведение, которое я вижу, действительно странно.Что возвращает 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 

Однако, если я затем получить доступ отдельный класс в пакете - Ничего особенного, я мог бы добавить - и создать новый класс, все идет не так. Here's the link to the code для Палестрины/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 

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

Спасибо.

+1

Здесь можно будет найти полный стек и соответствующие части кода. – khachik 2010-12-16 14:12:53

+1

След скажет вам, что зажимает и в какой строке кода. Однако вы не указали нам, какая строка кода есть, и вы также не указали строку кода, о которой идет речь. Таким образом, мы можем только догадываться. Однако я считаю маловероятным, что у этого есть что-то с возвратом при создании экземпляра и т. Д. – 2010-12-16 14:21:14

+0

Угадайте, есть ошибка в коде, который создает представление экземпляра этого класса. (`def __repr__`) – 2010-12-16 14:22:24

ответ

1

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

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

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

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

4

Ну, вы удалили соответствующую часть (след) и заменили ее на ... в пасте.

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

Вот моделирование ошибки:

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

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

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

Смежные вопросы