gpt4 book ai didi

python - isinstance 不适用于 AppEngine 中的 Decimal

转载 作者:太空狗 更新时间:2023-10-30 01:20:11 25 4
gpt4 key购买 nike

我有一个来自 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,即使(在 中使用 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

最佳答案

今天碰到这个,遇到了一个旧的mailing list post讨论了这个。

结果这个问题也得到了解决on stackoverflow以前也是。在此处粘贴答案以便于访问/减少 stackoverflow 服务器负载:


似乎 decimal.Decimal 类在 Google App Engine SDK 的某处打了补丁(或者模块被重新加载),这是在导入 decimal 的 MySQL 转换库和您导入它之间完成的。

幸运的是,我们可以通过更新 MySQL 转换表来解决这个问题:

from MySQLdb.constants import FIELD_TYPE
from MySQLdb.converters import conversions
import decimal

conversions[FIELD_TYPE.DECIMAL] = conversions[FIELD_TYPE.NEWDECIMAL] = decimal.Decimal

就是这样;上面的代码重置了 MySQL 类,您的 JSON 编码器类型检查成功。

另一种方法是查找 MySQLdb 正在使用的类:

class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, MySQLdb.converters.conversions[MySQLdb.constants.FIELD_TYPE.DECIMAL]):
return float(o)
return super(DecimalEncoder, self).default(o)

关于python - isinstance 不适用于 AppEngine 中的 Decimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com