【发布时间】:2019-07-06 17:11:46
【问题描述】:
我注意到虽然这不起作用:
class MyClass:
def __init__(self, i):
self.5i = i
myobj = MyClass(5)
print(myobj.5i)
这确实有效:
class MyClass:
def __init__(self, i):
setattr(self, '5i', i)
myobj = MyClass(5)
print(getattr(myobj, '5i'))
更重要的是,这也有效:
class MyClass:
def __init__(self, i):
self.__dict__['i.j'] = i
myobj = MyClass(5)
print(myobj.__dict__['i.j'])
sn-ps 2 和 3 是否可以保证工作?还是我们宁愿在这里有鼻恶魔,它们将无辜的灵魂带入地狱的邪恶计划是让这种恶作剧似乎奏效,而实际上却没有?
我问的原因是我正在将 JSON 对象(从 API 接收)转换为类。而且由于服务器喜欢返回有时看起来很重要的额外的未记录字段,而且我不喜欢丢失数据......这就是目前大多数 JSON 到对象的转换归结为:
class FooResponse:
def __init__(self, json_string):
self.__dict__.update(json.loads(json_string))
但是,但是……如果服务器返回一个带有一些非常奇怪的字段的 JSON 怎么办,例如:
{
"foo.bar": "Fizz-Buzz",
"1337": "speek"
}
或者诸如此类的?我必须尽我最大的努力来清理它还是简单的self.__dict__.update(json.loads(json_string)) 合适?
服务器文档接受 JSON 调用,其字段名称包含点或数字的字符串表示形式,因此我发现它也可能返回这样的 JSON。
【问题讨论】:
-
您应该始终清理来自不受信任来源的输入。 xkcd.com/327
-
嗯,这就是判断的地方:你信任谁?您的 API 是“信任”API,即您的用户了解所有信息,并且只为您提供良好的输入,还是您的 API 是“可疑的错误输入”API,即您的用户可能无知或恶意?一些 API 是混合的:例如,您可能有方法
set_trusted和set_untrusted(可能有更好的名称)。只是您提到 JSON 和 JSON 经常(并非总是,但经常)来自不受信任的来源。
标签: python attributes