Again, I was reading the Scala tutorial and find that she has built-in support of partial function call (see http://twitter.github.io/scala_school/basics.html#functions). This reminded me that Python does also has functools.partial(), which can be used as function shortcuts.
Let's see this example of Django.
# Let's have a Coupon that can either be fixed amount discount or percentage off
# But, we don't want to have model inheritance and table join to get the data
class Coupon(models.Model):
code = models.CharField(max_length=8)
type = models.CharField(max_length=11, choices=['fixedamount', 'percentage'])
amount = models.DecimalField(max_digits=8, decimal_places=2)
currency = models.CharField(max_length=3, choices=['USD', 'CAD'], default='')
# To create a Coupon based on certain conditions, you can have this
kwargs = {'code': code}
if condition_a:
kwargs.update({'type': 'fixedamount', 'currency': 'USD'})
elif condition_b:
kwargs.update({'type': 'percentage'})
kwargs.update({'amount': x if condition_c else y})
coupon = Coupon.objects.create(**kwargs)
# Or with functools.partial()
FixedamountCoupon = functools.partial(Coupon.objects.create, type='fixedamount')
PercentageCoupon = functools.partial(Coupon.objects.create, type='percentage')
if condition_a:
coupon = functools.partial(FixedamountCoupon, code=code, currency='USD')
elif condition_b:
coupon = functools.partial(PercentageCoupon, code=code)
coupon = functools.partial(coupon, amount=x if condition_c else y)
coupon = coupon()
Yes, we just shortcuted two types of Coupon using functools.partial(), created "sub-class" of Coupon. Furthermore, if the underlying function accepts positional arguments, we can also shortcut those arguments.
Clean code FTW.
