Python #2: Packing and unpacking arguments

Nỗi buồn của Lão Trư

Ngày xửa ngày xưa, đã lâu lắm rồi, từ cái hồi python ver 2, với cấu tạo cơ thể cồng kềnh, lão trư ăn uống rất vất vả:

    # cơ thể lão trư
    class LaoTru(object):
        def eat(self, what, e, ver):
            self.digest(what)
            self.digest(e)
            self.digest(ver)
    
    # cách lão trư ăn uống hàng ngày
    lao_tru = LaoTru()
    bunch_of_foods = [Fish(), Cat(), Dog()]
    lao_tru.eat(
        bunch_of_foods[0],
        bunch_of_foods[1],
        bunch_of_foods[2],
    )

Buồn của lão trư:

  • Buồn 1: mỗi bữa lão trư chỉ ăn được 3 món
    def eat(self, what, e, ver):
        ...
    
    # hay là luyện cơ hàm để ăn được nhiều hơn?
    def eat(self, what, e, ver, ver, ver):
        ...
    # mà thôi, mệt lão trư lắm :v
    # ăn nhiều lại phải tập nhiều
    
  • Buồn 2: lão trư phải tiêu hóa từng món một
    self.digest(what)
    self.digest(e)
    self.digest(ver)
    # giá mà lão trư có thể tiêu một lúc hết sạch luôn T_T
    
  • Buồn 3: lão trư phải bốc bỏ mồm từng cái một
    lao_tru.eat(
        bunch_of_foods[0],
        bunch_of_foods[1],
        bunch_of_foods[2],
    )
    # giá mà lão trư có thể nuốt chửng một phát sạch trơn T_T
    

Lão trư thời đại mới

Sang thời đại python ver 3, lão trư vui sướng hơn bao giờ hết, tất cả là nhờ cái asterisk "*".

  • Xử lí buồn 1 và 2 - làm sao để ăn được nhiều hơn mà chả phải tập tành:
    # nay đã có: asterisk! tất cả nằm gọn trong một list!
    def eat(self, *whatevers):
            self.digest(food) for food in whatevers
    
  • Xử lí buồn 2 - làm sao để nuốt một phát hết luôn
    # nay đã có: asterisk! list tóe loe thành nhiều mảnh!
    eat(*bunch_of_foods)
    
  • Bonus vui - ăn tráng miệng?:
    # nay đã có: asterisk! ăn không giới hạn!
    eat(*bunch_of_foods, Icecream(), Cacke())
    

Kết

Python 3 mang tới vô cùng những công cụ hữu ích, dấu asterisk (*) trước kia chỉ để làm phép nhân đã trở thành một thứ không thể thiếu mỗi ngày.

# toàn cảnh lão trư thời hiện đại
# thon thả hơn!
# ăn uống ko giới hạn!
class LaoTru(object):
    # cái này bọn tây gọi là "packing" arugments ~ đóng gói argument vào một cái list
    def(self, *whatevers):
        self.digest(food) for food in whatevers

lao_tru = LaoTru()
bunch_of_foods = [Fish(), Cat(), Dog()]
# cái này thì tây nó gọi ngược lại là "unpacking" arguments ~ đập tóe loe cái list ra thành nhiều phần tử
lao_tru.eat(*bunch_of_foods, Cake(), Icecream())