Custom format a la datetime

Santiago Basulto santiago.basulto at gmail.com
Sat Apr 18 22:24:18 EDT 2015


On Saturday, April 18, 2015 at 5:29:23 PM UTC-3, Peter Otten wrote:
> santiago.basulto at gmail.com wrote:
> 
> > Hello everybody. I'm writing a CLI program to do some search. It's an
> > internal tool. I'd like to provide the option to my user to format the
> > results as he/she'd like. Something similar to strftime on the datetime
> > module.
> > 
> > Example:
> > 
> >     from datetime import datetime
> >     d = datetime.utcnow()
> >     d.strftime("%Y-%m-%d")  # '2015-04-18'
> >     d.strftime("%y-%m-%d")  # '15-04-18'
> >     d.strftime("Today it's the %dth day in the %mth month of %Y") # 'Today
> >     it's the 18th day in the 04th month of 2015' # Don't pay attention to
> >     ordinals, just simple example.
> > 
> > Now, an example of with my application. Suppose my app search cars:
> > 
> >     python search_cars.py -F "Brand %B, model %m, year %Y"  # Brand Ford,
> >     model Focus, year 1996
> >     python search_cars.py -F "%B - %m (%y)"  # Ford - Focus (96)
> > 
> > I'd provide my user with a table like:
> > 
> > %B = Brand
> > %m = Model
> > %Y = Year format YYYY
> > %y = Year format YY
> > %s = Seller name
> > ... etc...
> > 
> > Thanks a lot for your help!
> 
> Make a dict to map the format to a function that extracts the value you are 
> interested in from a record you found with your search. Then replace the 
> format in the template with the value returned from that function.
> 
> >>> import re
> >>> record = dict(brand="Ford", model="Focus", year=1996)
> >>> format = {"B": lambda r: r["brand"],
> ... "m": lambda r: r["model"],
> ... "Y": lambda r: str(r["year"]),
> ... "y": lambda r: "{:02}".format(r["year"] % 100),
> ... }
> >>> template = "Brand %B, model %m, year %Y"
> >>> re.compile("%(.)").sub(lambda m: format[m.group(1)](record), template)
> 'Brand Ford, model Focus, year 1996'
> >>> template = "%B - %m (%y)"
> >>> re.compile("%(.)").sub(lambda m: format[m.group(1)](record), template)
> 'Ford - Focus (96)'
> 
> To allow literal % signs add
> 
> format = {
>     ...
>     "%": lambda r: "%"
> }
> 
> to the lookup dict.
> 
> For alternative approaches have a look at string.Template, str.format() etc.

Amazing! Thank you very much Peter!



More information about the Python-list mailing list