python3の関数アノテーションを試してみました

ネタ的には今更なんですけど、よくわかっていなかったので試してみました。
予め言っておきますと初歩的な内容なので期待しないで下さい。

引数の情報を取得する為に
http://docs.python.org/3.2/library/inspect.html#inspect.getfullargspec

http://code.google.com/p/anntools/
を参考にさせて頂きました。

以下のようなtest.pyを用意してみます。

# -*- coding: utf-8 -*-
from functools import wraps
from inspect import getfullargspec


class ArgumentError(Exception):
    def __init__(self, arg_name, val, typ):
        super(ArgumentError, self).__init__()
        print('引数 {} の {} は {} と型が違います'.format(arg_name, val, typ))


class RetValError(Exception):
    def __init__(self, retval, typ):
        super(RetValError, self).__init__()
        print('{} は 戻り値の型が {} ではありません'.format(retval, typ))


def validate(func):
    @wraps(func)
    def _validate(*args, **kwargs):
        argSpec = getfullargspec(func)
        for name, value in zip(argSpec.args, args):
            obj_type = func.__annotations__[name]
            if not isinstance(value, obj_type):
                raise ArgumentError(name, value, obj_type)
        result = func(*args, **kwargs)
        ret_type = func.__annotations__['return']
        if not isinstance(result, ret_type):
            raise RetValError(result, ret_type)
        print('OK')
        return result
    return _validate


@validate
def hoge(a: int, b: str = '!') -> str:
    val = str(a) + b
    return val

実際にどうなるのか試してみます。

>>> from test import hoge
>>> hoge(1)
OK
'1!'
>>> hoge('1')
引数 a の 1 は <class 'int'> と型が違います
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 26, in _validate
    raise ArgumentError(name, value, obj_type)
test.ArgumentError
>>> hoge(1, 'a')
OK
'1a'
>>> hoge(1, 3)
引数 b の 3 は <class 'str'> と型が違います
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 26, in _validate
    raise ArgumentError(name, value, obj_type)
test.ArgumentError

実装次第で色々出来そうです。

今のところ僕の中では型判定以外の利用方法があまり浮かばないのですが
今後色々と出てくると思いますし楽しみです。

zz.jsのドキュメントを書きました。

bitbucketへのリンクです。

https://bitbucket.org/ta2xeo/zz.js/wiki/Home

このzz.jsは自分が携わっているソーシャルゲームで実際に使用しているのですが
Androidは端末依存、ブラウザ依存があったりでしんどいです。

ですのでAndroid2.XはFlash LiteにしてAndroid4.0↑からHTML5でやっています。

zz.jsの今後についてですが
現在はスマートフォンの主要ブラウザにしか対応していないので
その他のブラウザやIEなどのPCブラウザでも動くようにしたいと思ってます。

モジュールも追加したいと思ってて
とりあえず試験的にADVを簡単に作れるようなものを用意しましたが、
まだまだ機能は足りません。

サウンドとかも現状ノーサポートです。

もう今年も終わり

先月26歳になったんですけど働き始めてからの年取ってる間隔が物凄く早いです。そして今年も終わりです。

今年はゆっくり年末年始を迎えられそうです。ここ数年はかなり忙しかった思い出が。たまには、まったり過ごすのも良いものです。

せっかくなので今年を振り返りつつ来年の抱負でも考えようかと思います。


1月の時点で所属していた会社は経営できない状態になってしまい辞めることになってしまいました。正直かなりショックでした。良いメンバーに恵まれていましたし、製作中のものはリリース直前まで来てて結局出せませんでしたから。
次の仕事どうしようということもありましたしね。

とりあえず知り合いの方の仕事を手伝うことになり、iOSのアプリを作っていました。3月くらいまでお手伝いしてたと思います。
アプリはその後無事リリース出来たと聞いて安心しています。

4月から新しい会社に移りました。
そこは小さい会社だったんですがプログラマーは僕一人だけだったので会社のネットワークやサーバーなどのインフラは僕がやることになり、今まで趣味でしかやっていなかったことをやらせて貰えました。やはり仕事としてやることはとても貴重な経験になりました。

プログラマーとしてはソーシャルゲームを一本作り、無事リリースを迎えることが出来ました。
メインプログラマーとしてやった仕事としては初めて世の中に出せたので個人的にはとてもありがたく嬉しく思います。現在でも問題なく継続して運営できているのは、周りのスタッフのおかげです。文句をブツクサ言いながらもしっかりとした仕事をやってくれる仲間には感謝の気持ちでいっぱいです。もちろん僕も頑張ってますよーw

そんなわけで今年も沢山経験を積むことが出来ました。去年も沢山新しいこと覚えましたが勉強しないといけないことはまだまだ山積みです。


来年の抱負ですが、もっとオープンソースを頑張りたいですね。
どこか興味のあるプロジェクトに参加出来たら良いと思ってますがなかなか踏み切れず、とりあえずは自分が公開してるソースのメンテナンスを頑張ろうかと思います。
できることからコツコツと・・・。

あとはブログの更新頻度を上げて情報を発信していきたいです。
なかなか難しいんですよねー。

裁量労働制ってあんまし良くないと思ってます。

以前所属してた会社は裁量労働制だったんです。

僕自身にとっては長短あって、良い点はお店とか役所寄ってから行きたいだとか用事済ませてから行きたいとかの場合で、悪い点は、連絡取りたい人がなかなか出社して来ないとかでした。

会社としてはやることやって貰えれば良くて、逆に仕事が終わらなければ何時間でも働いて貰うってことです。もちろん裁量労働制なので残業代なんて出ません。ここに関しては、仕事終われば早く帰れるのでしょうがないですね。
とは言え、仕事終われば次の仕事降ってくるだけなので早く帰れるなんてなかなか無いですけど。

何が悪いかって始業時間と就業時間が決まって無いのでメンバーが揃いにくいってことです。コアタイムはありますが大体昼から夕方みたいな感じになると思うので一番集中して作業できる(したい)朝には揃いません。

なので僕としては朝会やってる会社は羨ましかったですね。

集中して短時間で作業やりきっちゃうのが一番僕には合ってるのでそういうスタイルで働ける会社は良いなってだけなんですけど。

裁量労働制というよりはそういう環境な会社が問題なんでしょうけど裁量労働制な時点で大半の会社はそうなんじゃないでしょうか。

zz.jsを公開しました。

https://bitbucket.org/ta2xeo/zz.js

スマホ向けのJSライブラリです。
ソーシャルゲームFlashを移植する為に書きました。
PCブラウザでもChromeとかだったら動きます。
ActionScript3っぽく記述できるのが特徴ですがぶっちゃけ既に似たようなものが沢山出回ってるので二番煎じ感が半端ない。

コードが1500行くらいしかないので比較的軽いと思います。(ファイルサイズは。)
MovieClipクラスはアニメーション情報が入ったjsonオブジェクト渡せば動きます。
出来るだけ手間を掛けないで移植するのが目的だったので簡単なtween機能とかあります。
一応と言ってはなんですが某ソーシャルゲームで実際に使用しています。

ゲームを作りたいなら使用者が多く実績もあり有名なenchant.jsを使うのが良いと思いますが、そこまで機能いらんよ、モバイル向けだからファイルサイズ小さいほうがええんよ、とかだったら使い道あるかもしれません。

ezscroll.jsを公開しました。

https://bitbucket.org/ta2xeo/ezscroll.js

アンカータグを押した時にスクロールするスクリプトです。

僕が使いたくて作ったので超手抜きです。エラー処理もしてません。

面倒だったのでデフォルトだと全てのリンクが適用されるようになってます。
なので読み込むだけで使えます。