Wednesday, September 21, 2011

I'm my own grandpa.

A fellow Pythonaut had a simple problem...
How to test code with dependencies on the date?  Specifically, a Django project with models that have DateTimeFields with auto_now=True.

The chosen approach was to monkey-patch in order to return a constant value.
The first snag: is a C class.  This means it is not monkey-patchable.

This can be solved by monkey-patching the entire class.  The most straightforward thing to replace with is a new subclass of, whose only change is to override the today() function.

The second problem: there are now two kinds of's floating around the system.  Those by, and those created by every other function, which being C code will still return the same class.

Specifically, DateTimeField validates isinstance(data, before saving to the database.

A class which is simultaneously a super and subclass of is required.
Override __subclasshook__ so that isinstance(super(, is True.

>>> class DateProxy(
...    __metaclass__ = abc.ABCMeta
...    @classmethod
...    def __subclasshook__(cls, C): return True
...    @classmethod
...    def today(cls): return,9,20)
>>> = DateProxy

In other words, the superclass is also a subclass.  The parent of the parent being the grandparent, this class is it's own grandpa.


  1. I get why it has to be a _subclass_ of date, but why would it have to be a superclass??

  2. Check Our Website For Play Online Casino Thanks For Sharing...!!!
    baccarat online
    royal gclub

  3. Hello!! I'am glad to read the whole content of this blog and am very excited.Thank you.
    gclub casino online
    gclub casino

  4. Nice article great post comment ,thank for your sharing.

    Gclub จีคลับ