Welcome, guest | Sign In | My Account | Store | Cart

Have you wished for a completely Dummy object, one that you can do whatever you want to it? One you can return and all expressions will work?

No???

Hmm.. ok. But here it is anyway.

Python, 36 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Dummy(object):
    def __getattr__(self, attr):
        try:
            return super(self.__class__, self).__getattr__(attr)
        except AttributeError:
            if attr in ('__base__', '__bases__', '__basicsize__', '__cmp__',
                        '__dictoffset__', '__flags__', '__itemsize__',
                        '__members__', '__methods__', '__mro__', '__name__',
                        '__subclasses__', '__weakrefoffset__',
                        '_getAttributeNames', 'mro'):
                raise
            else:
                return self
    def next(self):
        raise StopIteration
    def __repr__(self):
        return 'Dummy()'
    def __init__(self, *args, **kwargs):
        pass
    def __len__(self):
        return 0
    def __eq__(self, other):
        return self is other
    def __hash__(self):
        return hash(None)
    def __call__(self, *args, **kwargs):
        return self
    __sub__ = __div__ = __mul__ = __floordiv__ = __mod__ = __and__ = __or__ = \
    __xor__ = __rsub__ = __rdiv__ = __rmul__ = __rfloordiv__ = __rmod__ = \
    __rand__ = __rxor__ = __ror__ = __radd__ = __pow__ = __rpow__ = \
    __rshift__ = __lshift__ = __rrshift__ = __rlshift__ = __truediv__ = \
    __rtruediv__ = __add__ = __getitem__ = __neg__ = __pos__ = __abs__ = \
    __invert__ = __setattr__ = __delattr__ = __delitem__ = __setitem__ = \
    __iter__ = __call__

Dummy = Dummy()

You can now use Dummy anytime any object is required.

>>> a = Dummy() ; d = Dummy() ; j = Dummy(3)
>>> j **= (d + 3) * (a / j)
>>> print j is j('parameters', any='parameters').attribute.access.is_.allowed['and item']()()
True
>>> print (d < j, d > j, d == j)
(False, False, True)
>>> print sorted([Dummy(n + d) for n in xrange(3)]), sorted(a)
[Dummy(), Dummy(), Dummy()] []
>>> print '%d == %d == 0' % (len(a), len(list(a)))
0 == 0 == 0

2 comments

Louis RIVIERE 15 years, 8 months ago  # | flag

see : Null in recipe 68205

nosklo (author) 15 years, 7 months ago  # | flag

Thanks for pointing me this recipe, Louis.

But since I use a different approach, testing for special attributes and overriding all main functions of objects. Null works only for attributes and calls, and raises errors for a lot of uses.

I guess that's why I named it Dummy, it can act as a list, or as a dict, or as anything else.

Created by nosklo on Sat, 23 Aug 2008 (MIT)
Python recipes (4591)
nosklo's recipes (5)

Required Modules

  • (none specified)

Other Information and Tasks