Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 验证嵌套类中的属性_Python - Fatal编程技术网

Python 验证嵌套类中的属性

Python 验证嵌套类中的属性,python,Python,我想安全地检索变量“val”,如果“val”不存在,我想返回False(而不是显示错误) 我知道我可以这样使用逻辑运算符: class first: class second: class third: class forth: val = "test" try : print first.second.third.forth.val except AttributeError: pass >

我想安全地检索变量“val”,如果“val”不存在,我想返回False(而不是显示错误)

我知道我可以这样使用逻辑运算符:

class first:
    class second:
        class third:
            class forth:
                val = "test"
try :
    print first.second.third.forth.val
except AttributeError:
    pass
>>> class first:
...         class second:
...             class third:
...                 class forth:
...                     val = "test"
... 
>>> hasattr(first.second.third.forth.fifth,'val')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class forth has no attribute 'fifth'
打印first.second和first.second.third和first.second.third.forth和first.second.third.forth.val或False

或者把它放在一个'尝试。。。除了像这样的“块”:

class first:
    class second:
        class third:
            class forth:
                val = "test"
try :
    print first.second.third.forth.val
except AttributeError:
    pass
>>> class first:
...         class second:
...             class third:
...                 class forth:
...                     val = "test"
... 
>>> hasattr(first.second.third.forth.fifth,'val')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class forth has no attribute 'fifth'
但上面的两个示例都太长,无法阅读,尤其是当它们有太多嵌套类时

我的问题是,还有其他更简单的方法吗?我希望得到像……这样的东西?。C#或至少函数中的运算符,可以安全且易于读取地对其进行评估

我的问题与这个问题类似:

但区别在于我的是嵌套类,如果我使用hasattr()或getattr(),当类中缺少一个时,我仍然会有错误,如下所示:

class first:
    class second:
        class third:
            class forth:
                val = "test"
try :
    print first.second.third.forth.val
except AttributeError:
    pass
>>> class first:
...         class second:
...             class third:
...                 class forth:
...                     val = "test"
... 
>>> hasattr(first.second.third.forth.fifth,'val')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class forth has no attribute 'fifth'

这可能是个人喜好的问题,但Python中有一个重要的特性,您的
try/except
适合于此。(我会那样做的,FWIW。)

关于由于多重嵌套而导致的长表达式:

  • 考虑一下,在任何情况下,您是否真的需要这么多嵌套
  • 如果确实需要这么多嵌套,但access表达式太长,可以将其分解:

    >>> def eval(cls, args, default=False):
    ...     for arg in args.split('.') :
    ...         if not hasattr(cls,arg) : return default
    ...         cls = getattr(cls,arg)
    ...     return cls
    ... 
    >>> eval(first,'second.third.forth.val','Default Value')
    'test'
    >>> eval(first,'second.third.forth.fifth','Default Value')
    'Default Value'
    

  • 字符串值=first.second.third.forth.val;
    bool isValue=string.NullOrEmpty(值)?假:价值

    我会回答我自己的问题,这样它就可以被标记为已解决

    我目前正在使用这种方法,如果您有更好的解决方案,请告诉我

    try :
        second = first.second
        third = second.third
        forth = third.forth
        print forth.val
    except AttributeError:
        pass
    

    有几个级别的嵌套类会使代码更难阅读。如果可能,尝试将其展平。x?.y–空条件成员访问。如果左侧操作数为null,则返回null。这并不是说存在。@TigerhawkT3谢谢,我会尽可能把它展平。@saikumarm“这不是说存在”是什么意思?来自:“展平比嵌套好。”。我的代码是python的,当我赋值=first.second.third.forth.val时,我会得到AttributeError。那是什么语言。。。C#?这肯定不是Python。我尽量不使用“try..except”块,因为像这样的嵌套类太多了。这样行吗?如果第一个存在而第二个不存在呢?