internal circular class references

rdmurray at bitdance.com rdmurray at bitdance.com
Thu Dec 11 14:06:34 EST 2008


On Thu, 11 Dec 2008 at 09:33, Ethan Furman wrote:
> Carl Banks wrote:
>>  On Dec 10, 5:26 pm, Ethan Furman <et... at stoneleaf.us> wrote:
>>  First of all, do you even need to wrap the datetime.date class?  With
>>  Python's duck typing ability, you could have a separate NullDate class
>>  to go alongside the datetime.date, and use a regular datetime.date
>>  object when the date is present, and NullDate when it's absent.  If
>>  necessary you can subclass datetime.date to add any new methods it
>>  would have to have.  Use a factory function to return either NullDate
>>  or a datetime.date depending on whether the dbf cell is empty.
>>
>>  class ValidDate(datetime.date):
>>      def is_valid(self):
>>          return True
>>
>>  class NullDate(object):
>>      # implement any necessary methods of datetime.date interface here
>>      def is_valid(self):
>>          return False
>>
>>  def create_date_from_dbf_cell(dbf_cell):
>>      if dbf_cell.empty():
>>          return NullDate()
>>      return ValidDate(dbf_cell.value)
>>
>>
>>  If you do this, you don't have to muck around with __getattr__ or
>>  __new__ or snooping to datetime.date's class dict anything like that.
>>
>>
>>  Carl Banks
>
> Good question.  My goal with NullDate is to have a date object that I can 
> treat the same regardless of whether or not it actually holds a date. 
> NullDates with no value should sort before any NullDates with a value, should 
> be comparable to dates as well as NullDates, and should support all the same 
> methods.  In other words, I don't want to have to worry about whether my date 
> object has an actual date under most circumstances (printing, using as 
> dictionary keys, comparing, etc.).
>
> Does my design make more sense given these expanded requirements, or could it 
> still be done simpler?  For that matter, do my requirements make sense?

What Carl is saying is that since python uses duck typing ("if it quacks
like a duck, it is a duck"), all you need to do is make your NullDate
object quack enough like a date to handle your use cases, and then you
can freely mix dates and NullDates _without having to care which one a
given object is_ (python won't care).  (Until you do care, at which
point you can use isinstance to find out if it is a NullDate).

As far as I can see, your requirements as you've outlined them can be met
by mixing date objects and appropriately implemented NullDate objects.
And that way NullDates will _only_ represent null dates, thus making
its name more meaningful :).

To do this you just need to implement on NullDate those methods that
are going to give NullDate the behavior you need: the rich comparison
operators, __str__, __hash__, etc.  Or it might be easier to subclass
date and override some of the methods.

Unless I'm misunderstanding your requirements, of course :)

--RDM



More information about the Python-list mailing list