datetime.iterdate
Robert Brewer
fumanchu at amor.org
Mon Jul 12 14:47:04 EDT 2004
Larry Bates wrote:
> List comprehension to the rescue:
>
> day_range=[first+datetime.timedelta(x) for x in
> range((last-first).days+1))]
> for day in day_range:
> do_something_with(day)
>
> I'm not entirely sure the syntax is correct (I just
> copied yours for the example) , but you get the idea.
> I think it clearly defines the list of items you are
> iterating over and keeps the definition close to the
> loop where you do something (rather in a function
> that may be defined far away in the code).
>
> "Robert Brewer" <fumanchu at amor.org> wrote in message
> news:mailman.236.1089594533.5135.python-list at python.org...
> Anyone else tired of typing date-addition logic when
> iterating? It would
> be nice if the datetime package had something like:
>
> def iterdates(first, last):
> for day in range((last - first).days + 1):
> yield first + datetime.timedelta(day)
>
> ...notice the inclusive boundaries (i.e. last gets returned). This
> simple construct would make ugly date loops a lot cleaner:
>
> for day in datetime.iterdates(first_date, last_date):
> do_something_with(day)
Listcomps are nice tools, but don't address the "problem" I was trying
to "solve", which is ugliness. Listcomps just shuffle syntax; I'm trying
to hide some of it. By "hide", I mean, "encapsulate logic", in the sense
of building more powerful expressions out of intermediate
domain-appropriate components; "iterdates" is a candidate for that IMO.
All of which is to say that I _don't_ want the "definition close to the
loop".
I think I'd settle for Tim's suggestion to make the endpoint exclusive.
More like:
def daterange(start, end):
for day in xrange((end - start).days):
yield start + datetime.timedelta(day)
...which starts to lead toward questions of generating sequences in
general, which I think is worthy of some serious study, and probably a
PEP. Maybe someday we'll have a __range__ classmethod, or a "class"
argument to range(), or something. For now, I think datetime.daterange()
would be worth including, but if Michele and I are the only ones, I'll
stop pursuing it.
Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org
More information about the Python-list
mailing list