mk-toolブログスマートフォン用の表示で見るmk-toolブログ2018-04-24【Python】issubclassでTrueを期待するのにFalseが返ってくる概要issubclassを使っていて、Trueを期待するのにFalseが返って来て頭がおかしくなりそうになった。時間をかけた割に大したことを得られなかった悲しさをこのブログにぶつける。本題ある復刻プロジェクトをやっているのだが、そのシステムではdynamoDBを利用している。dynamoDBを利用するためにはbotoというライブラリを利用しているが、せっかくやるのでbotoもboto3にアップデートすることに決めた。botoを利用する際は、さらにbotoの扱いを抽象化するdynamodb_mapperというものを利用していたが、dynamodb_mapperは最終リリースが2013年であり、更にboto3に対応していないため自分でboto3用のmapperを書かなければいけなかった。動かせそうなmapperを作成して動作確認をしている時に問題が起きた。ここでmapperのクラス名はDynamoDBModelで、以下のようにしてimportしている。DynamoDBModelそして、今回model_boto3というファイルでmapperを作成したので、以下のようにimport文を書き換える。DynamoDBModel新mapperを作ったが、class名はもちろんのことメソッドのインターフェースを変えていないところが自身のこだわったというか、意識した部分だ(コードをきれいにしたらmapperは公開しようと思う)。このことが災いを引き起こすなんて思ってもみなかった。プロジェクトで実際にdynamoDBを利用するためのModelでは、DynamoDBModelクラスを継承している。以下のようなかんじで。Hoge(DynamoDBModel)このように継承しているのは、システム中で利用しているDBはdynamoDBだけでなくMySQLも利用しており、ModelがDynamoDBModelを継承しているか、MySQL用のクラスを継承しているかによって処理を分けるためだ。この処理を分ける部分だが、以下のようにしてDynamoDBModelを継承しているかを判断していた。DynamoDBModelのimportではdynamodb_mapper.model_boto3を指定しているし、issubclass()で指定しているDynamoDBModelの部分にマウスポインタを当てると、vscodeがこの型はdynamodb_mapper.model_boto3のDynamoDBModelですよって教えてくれているし、これで完璧でしょ、と思った。(DynamoDBModel,))issubclassの使い方が間違っているのかな、と思ったのだが全然間違ってなさそうだし、DynamoDBModelはdynamodb_mapper.model_boto3なはずだし、何が悪いのかがさっぱりわからなかった。悩んだり調べたりして2時間経った時にDynamoDBModelはカーソルを乗っけるとdynamodb_mapper.model_boto3って出てくるけど実は旧DynamoDBModelのdynamodb_mapper.modelを参照しているのではないかと思った。以下のようにするとtrueが返って来た。(dynamodb_mapper.model_boto3.DynamoDBModel,))実際、こんなフルパスで型指定をしないので旧DynamoDBModelは駆逐して新DynamoDBModelしかない状態にしておいたり、そもそもDynamoDBBoto3Modelみたいな名前にして今後開発を進めて行こうと思った。関係ないがこの件について調べてみると、pythonのissubclassでハマるという記事があり、抽象クラスに対してはissubclass()は継承していてもfalseを返してくる、という豆知識も学んだ。時間をかけた割には得たものが小さすぎるが、次へ進もう。以下のエラーが発生したためメモ。Python3では__buildin__...2016-08-14【機械学習】gensimのチュートリアルをやってみた(その1)gensimのチュートリアルをやってみました。(1)はてなブログをはじめよう!gamushiroSさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。