LT駆動開発21でLTしてきました。 タイトル「内包表記とPythonと…Option」です。 PyCon Mini Hiroshima用に用意してたネタですが、参加できなかったので放出しました。 Pythonの内包表記でScalaのOptionのようなものをつくってみました。

Pythonの内包表記はScalaではfor式で表現ができます。 Scalaではリスト以外のものでもfor式が使えます。 代表格としてOptionが上げられます。 ということで、PythonにもOptionクラスをつくり内包表記で利用できるようにしてみました。 スライドに登場するように内包表記に対応するために、__iter__nextメソッドを実装をしています。

class Option:
    def __init__(self, value):
        self.value = value
    def __iter__(self):
        return self
    def next(self):
        if self.value == None:
            raise StopIteration
        else:
            ret = self.value
        self.value = None
            return ret
    def __str__(self):
          if self.value == None:
               return "Nothing"
          else:
               return "Some(%d)" % self.value

def add(x, y):
  return [ x_+ y_ 
    for x_ in x 
    for y_ in y
  ]

add(Option(1), Option(2))    # => [3]
add(Option(1), Option(None))  # => []
add(Option(None), Option(2))  # => []

LT駆動はゆるふわに個々が学んだことを発表していてとても楽しいです。気軽に参加してみてください。