主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python: 2と3に対応する数値の型チェック

                
tags: python
 Python 2ではテストをパスしたのに3でエラーを吐いたスクリプトがあったので確認した。整数をチェックしているところでエラーが起きていた。

 整数チェックを下記のように書いていた。
if isinstance(n, (int, long)):

 上記はPython 3でlongがintに統合され、なくなっているのでエラー。世間ではPython 3への移行が済んでいないところがあるので(GoogleAppEngineとか)、公開しているようなスクリプトは2と3に両対応させたい。そんなとき上のような問題はどうするか。ググりつつ考えてみた。

・sixという互換支援のモジュールを使う
たった一つの簡単な問題に標準以外のモジュールを使うよりちょっと考えたいので保留

・tryを使う
try:
long
NUMBER_TYPE = (int, long)
except:
NUMBER_TYPE = int

if isinstance(n, NUMBER_TYPE):

C#を書いているときに例外を使うのはパフォーマンスを落とすというのを読んだ。Pythonでも例外はそういいわけでもないとする記事もあったので却下。

・builtinsを使う
if "long" in vars(__builtins__):
NUMBER_TYPE = (int, long)
else:
NUMBER_TYPE = int

if isinstance(n, NUMBER_TYPE):

2から3への変化で__builtins__がbuiltinsになる。スクリプトを統一できないので却下。

・Pythonバージョンをチェックして真っ当にやる。
if sys.version_info[0] == 2:
NUMBER_TYPE = (int, long)
else:
NUMBER_TYPE = int

if isinstance(n, NUMBER_TYPE):

問題なさそう。結局これを使った。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。