是否有任何"超载点运算符"的技巧?

Ale*_*lex 16 python json

我知道这个问题有点奇怪,但我想不出任何其他说法.我有一个处理大型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__也是例如字典,你也需要将它们包装起来.

  • 您可能希望使用`try:self.get(key),除了KeyError:从KeyError`引发AttributeError().这样,缺少的属性会报告正确的属性错误. (2认同)