Python 验证嵌套类中的属性
我想安全地检索变量“val”,如果“val”不存在,我想返回False(而不是显示错误) 我知道我可以这样使用逻辑运算符: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 >
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。)
关于由于多重嵌套而导致的长表达式:
>>> 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”块,因为像这样的嵌套类太多了。这样行吗?如果第一个存在而第二个不存在呢?