私はdecimal.Decimal
のインスタンスをSQLAlchemyクエリから取得しています。私は、オブジェクトをシリアル化する必要があるとして、私はに対処するためのJSONシリアライザを作成しましたDecimal
:はAppEngineのDecimalで動作しません
import decimal
class AlchemyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, decimal.Decimal):
return str(obj)
return json.JSONEncoder.default(self, obj)
不幸な事はisinstance(obj, decimal.Decimal)
が(にPDBを使用していても、例えばTrue
を返さないということです上記default
法):
import inspect
inspect.getfile(obj.__class__) # => '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.pyc'
inspect.getfile(blah.__class__) # => '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.pyc'
:
obj.__class__ # => <class 'decimal.Decimal'>
blah = decimal.Decimal()
blah.__class__ # => <class 'decimal.Decimal'>
isinstance(obj, decimal.Decimal) # => False
isinstance(blah, decimal.Decimal) # => True
isinstance(obj, obj.__class__) # => True
Iの両方のインスタンスが参照モジュールが同じモジュールであることを確認しました
私は本当にこれが動作していない理由を理解したいです!
EDIT
これは、AppEngineののdev_appserver.py
環境で実行している場合、問題が発生しただけということが判明しました。シンプル:
isinstance(db.session.execute('SELECT amount FROM model LIMIT 1').fetchone()[0], decimal.Decimal)
戻りFalse
コンソールから実行したときのAppEngine dev_appserverとTrue
を経由して要求を行います。
'OBJ .__ class__ IS何とか.__ class__'の結果は何ですか? – BrenBarn
@BrenBarnそれが 'False' – Aert
あなたのコードにインデントエラーがあるようです...' return json.JSONEncoder.default(...) 'はおそらく' default'関数内にあるはずです。 – mgilson