gpt4 book ai didi

python - 将字符串转换为 NDB 属性的正确类型的正确方法?

转载 作者:太空狗 更新时间:2023-10-29 19:27:41 25 4
gpt4 key购买 nike

如果我有一些来自 GET 或 POST 请求的(字符串)值以及相关的 Property 实例,一个 IntegerProperty 和一个 TextProperty,比如,有没有一种方法可以将值转换为正确的(用户)类型,而无需冗长乏味的 isinstance 调用链?

我希望重现这种功能(为清楚起见省略了所有输入验证):

for key, value in self.request.POST.iteritems():
prop = MyModel._properties[key]

if isinstance(prop, ndb.IntegerProperty):
value = int(value)
elif isinstance(prop, (ndb.TextProperty, ndb.StringProperty)):
pass # it's already the right type
elif ...
else
raise RuntimeError("I don't know how to deal with this property: {}"
.format(prop))

setattr(mymodelinstance, key, value)

例如,如果有办法从 IntegerProperty 中获取 int 类,从 BooleanProperty 中获取 bool 等,就可以完成这项工作。

据我所知,ndb 元数据 API 并没有真正优雅地解决这个问题;不过,使用 get_representations_of_kind 我可以减少案例数。

最佳答案

您可以使用 dict 将对象的 type 用作键并将内置类型用作键,从而在用户定义类型与内置类型之间进行映射值(value)。

F.E.

class IntegerProperty(int):
pass

class StringProperty(str):
pass

a, b = IntegerProperty('1'), StringProperty('string')

def to_primitive(obj):
switch = {IntegerProperty: int, StringProperty: str}
return switch[type(obj)](obj)

for x in (a, b):
print(to_primitive(x))

因为这里的键是对象的类型而不是isinstance检查,如果多个用户定义的类型映射到单个内置类型将出现KeyError如果类型不在 dict 中。因此,您必须显式地将每个用户定义的类型添加到开关 dict 中。

F.E.

class TextProperty(StringProperty):
pass
switch = {IntegerProperty: int, StringProperty: str, TextProperty: str}

尽管 TextPropertyStringProperty 的子类,但上面我们已经将新的 TextProperty 添加到 switch 中。如果您不想这样做,我们必须从 isinstance 检查中获取 key 。
这是怎么做的;

class IntegerProperty(int):
pass

class StringProperty(str):
pass

class TextProperty(StringProperty):
pass

a, b, c = IntegerProperty('1'), StringProperty('string'), TextProperty('text')

def to_primitive(obj):
switch = {IntegerProperty: int, StringProperty: str}
key = filter(lambda cls: isinstance(obj, cls), switch.keys())
if not key:
raise TypeError('Unknown type: {}'.format(repr(obj)))
key = key[0]

return switch[key](obj)

for x in (a, b, c):
print(to_primitive(x))

关于python - 将字符串转换为 NDB 属性的正确类型的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860883/

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