Какой тип Python является наиболее общим, к которому я могу добавить атрибуты? - PullRequest
6 голосов
/ 14 октября 2010

У меня есть класс Foo с методом isValid. Затем у меня есть метод bar (), который получает объект Foo и поведение которого зависит от того, действителен он или нет.

Для проверки этого я хотел передать некоторый объект в bar, метод isValid которого всегда возвращает False. По другим причинам я не могу создать объект Foo во время тестирования, поэтому мне нужен объект для его подделки. Сначала я подумал о создании наиболее общего объекта и добавлении к нему атрибута isValid для использования его в качестве Foo. Но это не совсем сработало:

>>> foo = object()
>>> foo.isValid = lambda : False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'isValid'

Я обнаружил, что у объекта нет __dict__, поэтому вы не можете добавить к нему атрибуты. На этом этапе я использую обходной путь для создания типа на лету для этой цели, а затем создаю объект этого типа:

>>> tmptype = type('tmptype', (), {'isValid' : lambda self : False})
>>> x = tmptype()
>>> x.isValid()
False

Но это кажется слишком длинным выстрелом. Должен быть какой-то общедоступный общий тип, который я мог бы использовать для этой цели, но какой?

Ответы [ 3 ]

6 голосов
/ 14 октября 2010

у вас есть правильная идея, но вы можете сделать ее более общей.Либо

 tmptype = type('tmptype', (object,) {})

или

 class tmptype(object):
     pass

Тогда вы можете просто сделать

foo = tmptype()
foo.is_valid = lambda: False

, как вы хотели сделать с object.Таким образом, вы можете использовать один и тот же класс для всех ваших динамических задач, требующих исправления ошибок.

4 голосов
/ 14 октября 2010

Просто для того, чтобы был дан правильный ответ, и людям не нужно читать все комментарии: Нет такого типа. Он был предложен, обсужден, и идея была отклонена. Вот ссылка, которую aaronasterling разместил в комментарии, где больше можно прочитать: http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html

1 голос
/ 14 октября 2010

почему вы должны сделать это сложным?Я думаю, что самый простой способ (и «стандартный» способ) состоит в том, чтобы сделать

class FakeFoo(object):
    def is_valid():
        return False

, кроме того, использование лямбды не очень хорошо в этом контексте ... взгляните на это: http://python -history.blogspot.com / 2009/04 / originins-of-pythons-functions-functions.html от BDFL

и так далее ...

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