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.
No response to “Partial function call”
Post a Comment