読者です 読者をやめる 読者になる 読者になる

Pythonの関数やメソッドの戻り型を指定するデコレータを書いた

http://github.com/taka84u9/type_test

動機

Pythonでは関数の戻り型は完全に自由です。ある時はint、またある時はstrなど。
基本的にはそれで嬉しいのだけど、戻り型が常に同じ場合も多いし、リファクタリングした結果へんなバグが入ったりすることもある。また、コメントを見ないと何が返ってくるか分からない場合があったりして、若干不便に思うこともあります*1
そんなこんなで、ちょっとデコレータで実装しました。実装にかかった時間は1時間強くらい。

使い方

return_type関数は関数デコレータとして使用することができます

from type_test import return_type
@return_type(int)
def hoge1():
    return 1

これは一般的なプログラミング言語における

public int hoge1(){...}

と同義です。 ユーザ定義のクラスオブジェクトも指定できます

class Foo(object):
    pass
@return_type(Foo)
def hoge2():
    return Foo()

listやtupleを指定すると、要素を考慮せずに、リストやタプルを返すことを強制することができます

 @return_type(list)
 def hoge3():
     return [1, "a"] # リストの中身は見ない

intのリストが欲しい場合は次のように書きます

@return_type([int])
def hoge4():
    return [1, 2]

これは

public int[] hoge4(){...}

と似ていますが、Pythonのリストなので返り値の長さに制限はありません。 intのタプルが欲しい場合は次のように書きます

@return_type((int, int))
def hoge5():
    return (1, 2)

@return_type((int, str))
def hoge6():
    return (1, "a") # OK

# タプルの場合は長さが同じ必要がある
@return_type((int, ))
def hoge7():
    return (1, 2) # Error

戻り値の型指定はリストやタプルを用いてネストすることができます

@return_type([(str, int)])
def hoge8():
    return [("a", 1), ("b", 2)] # OK

*1:関数名を上手に付ければ回避できる問題かも知れませんが。