我知道这个问题有点奇怪,但我想不出任何其他说法.我有一个处理大型json对象的应用程序,我希望能够只说:
object1.value.size.whatever.attributexyz
Run Code Online (Sandbox Code Playgroud)
代替
object1.get('value').get('size').get('whatever').get('attributexyz')
Run Code Online (Sandbox Code Playgroud)
是否有一些聪明的方法来捕获AttributeError将被引发的内容并检查数据结构内部是否该属性对应于其任何值?
Luc*_*nes 25
在object1课堂定义中,
def __getattr__(self, key):
return self.get(key)
Run Code Online (Sandbox Code Playgroud)
任何尝试解析实际上不存在于对象本身上的属性,方法或字段名称的任何尝试都将传递给__getattr__.
如果您无法访问类定义,即它类似于字典,请将其包装在类中.对于字典,您可以执行以下操作:
class DictWrapper(object):
def __init__(self, d):
self.d = d
def __getattr__(self, key):
return self.d[key]
Run Code Online (Sandbox Code Playgroud)
请注意,如果密钥无效,将引发KeyError; 然而,惯例是提出一个AttributeError(谢谢,S.Lott!).如有必要,您可以像这样重新引发KeyError作为AttributeError:
try:
return self.get(key)
except KeyError as e:
raise AttributeError(e)
Run Code Online (Sandbox Code Playgroud)
还要记住,如果你要返回的对象__getattr__也是例如字典,你也需要将它们包装起来.