random code 6: Python
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class SelectDateWidget(Widget): """ A Widget that splits date input into three <select> boxes. This also serves as an example of a Widget that has more than one HTML element and hence implements value_from_datadict. """ none_value = (0, '---') month_field = '%s_month' day_field = '%s_day' year_field = '%s_year' def __init__(self, attrs=None, years=None, required=True): # years is an optional list/tuple of years to use in the "year" select box. self.attrs = attrs or {} self.required = required if years: self.years = years else: this_year = datetime.date.today().year self.years = range(this_year, this_year+10) def render(self, name, value, attrs=None): try: year_val, month_val, day_val = value.year, value.month, value.day except AttributeError: year_val = month_val = day_val = None if isinstance(value, basestring): if settings.USE_L10N: try: input_format = get_format('DATE_INPUT_FORMATS')[0] v = datetime.datetime.strptime(value, input_format) year_val, month_val, day_val = v.year, v.month, v.day except ValueError: pass else: match = RE_DATE.match(value) if match: year_val, month_val, day_val = [int(v) for v in match.groups()] choices = [(i, i) for i in self.years] year_html = self.create_select(name, self.year_field, value, year_val, choices) choices = MONTHS.items() month_html = self.create_select(name, self.month_field, value, month_val, choices) choices = [(i, i) for i in range(1, 32)] day_html = self.create_select(name, self.day_field, value, day_val, choices) output = [] for field in _parse_date_fmt(): if field == 'year': output.append(year_html) elif field == 'month': output.append(month_html) elif field == 'day': output.append(day_html) return mark_safe(u'\n'.join(output)) |
Python, the new language that’s taking over the world.
This is the third most common language on GitHub, and this file is taken from django, everyone’s favorite web framework except perhaps for Ruby on Rails.
So, what are we seeing here? Well, Python is well-known for being a whitespace-matters language, part of the great backlash against “classic” parsing technology, and so there are no curlies required for method bodies, or semicolons for statement endings. At this point, I think we’re far enough along to take this in stride.
We’ve clearly also got superclasses, dynamic typing, default arguments, some pattern-matching, ooh! nice list comprehensions.
Naturally enough, you’ve also got lots of nasty things like an array append operator that performs needless mutation, and good old return. Honestly, in a language where mutation is the norm, return definitely improves readability.
Basically, looks like a pretty straightforward language; fairly readable, nothing much to complain about. Maybe it’s time to go to stranger things!