Python 3.0 かわいいよ

あああああ Python 3.0 かわいいよほんとかわいいよ
かわいすぎて隅々までチュッチュしたいお



__annotations__ プロパティ

Python 3.0 一番の目玉。個人的に。
関数リテラルが大きく拡張された。

def plus(lhs: int, rhs: int) -> int:
    """ただの足し算。"""
    return lhs + rhs

plus.__annotations__
# {'lhs': <class 'int'>, 'rhs': <class 'int'>, 'return': <class 'int'>}

仮引数リストに : expression が、仮引数リストの後に -> expression が書けるようになった。
書くか書かないかは全くの任意で、どっちにしても関数の動作には直接影響しない。
また、 expression すなわち式が書けるということなので

def foo(arg1: "こんなのも",
        arg2: "大丈夫" in "こんなのも大丈夫です" = "これデフォルト値ね",
        arg3: (list, "こんなのも") = None,
        *args: ["任意引数リストも大丈夫さ!"],
        **kwargs: ({x for x in 'abracadabra' if x not in 'abc'}, "うはあ")) -> None:
    pass

foo.__annotations__
# {'args': ['任意引数リストも大丈夫さ!'],
#  'return': None,
#  'arg1': 'こんなのも',
#  'arg2': True,
#  'arg3': (<class 'list'>, 'こんなのも'),
#  'kwargs': ({'r', 'd'}, 'うはあ')}

これは気持ち悪い。 (良い意味で)


まあ、こういうリテラルがあればさ。
multimethod みたいな実装も楽になるよね。

class RaiseWrapper: pass

def raises(cls: type = None) -> RaiseWrapper:
    """例外検査ラッパ。
    
    適当に。
    """
    return RaiseWrapper(cls)


class List:
    """意味のない配列クラス。"""

    @raises(NotImplementedError)
    def get_merged(self: List, mergee: List) -> List:
        """リストをマージした結果を持つ新しいインスタンスを返す。
           
        まだ実装されていません。
        """
        raise NotImplementedError()

# Traceback (most recent call last):
#   File "/path/to/file", line %, in <module>
#     class List:
#   File "/path/to/file", line %, in List
#     def mergeAndClone(self: List, merge_with: List) -> List:
# NameError: name 'List' is not defined

んー、分かりきってたことだけど、惜しい。



次は ABC について書こうと思う。