【发布时间】:2016-12-22 00:03:27
【问题描述】:
我有一个来自 SQLAlchemy 查询的 decimal.Decimal 实例。由于我需要序列化对象,所以我创建了一个 JSON 序列化程序来处理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) 没有为实例返回True,即使(在上面的default 方法中使用pdb):
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
我确实检查了两个实例引用的模块是同一个模块:
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'
我真的很想知道为什么这不起作用!
编辑
事实证明,只有在 AppEngine 的dev_appserver.py 环境下运行时才会出现该问题。一个简单的:
isinstance(db.session.execute('SELECT amount FROM model LIMIT 1').fetchone()[0], decimal.Decimal)
通过 AppEngine dev_appserver 发出请求时返回 False,从控制台运行时返回 True。
【问题讨论】:
-
obj.__class__ is blah.__class__的结果是什么? -
@BrenBarn 这是
False -
您的代码中似乎有缩进错误...
return json.JSONEncoder.default(...)应该在default函数中。 -
@mgilson 干杯,它是 - 只是在将其复制到 SO 时出错。
-
我们有没有可能重现这种奇怪的行为?
标签: python google-app-engine sqlalchemy decimal