2016-03-28 92 views
0
class first: 
    class second: 
     class third: 
      class forth: 
       val = "test" 

我想安全地取回變量「VAL」。在「VAL」不存在我想返回False(而不是顯示錯誤)驗證屬性在嵌套類

我知道我可以使用邏輯運算符是這樣的:

打印first.second和first.second.third和first.second.third.forth和first.second.third.forth.val或假

或把它放在一個'嘗試...除了'像這樣的塊:

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

但上述兩個例子實在太長了,當他們有太多的嵌套類

我的問題是,有沒有其他更簡單的方法來做到這一點尤其要閱讀?我希望有像這樣的東西。在C#中的運算符或至少可以安全評估並易於閱讀的函數。

我的問題是類似這樣的問題:How to know if an object has an attribute in Python

但不同的是,我的是在嵌套類,如果我使用hasattr()或GETATTR()我仍然有錯誤,當一個類是缺少這樣的:

>>> 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' 

但它確實給我一個想法,創建這樣一個功能:

>>> 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' 
+1

這樣的幾個級別的嵌套類會讓你的代碼更難以閱讀。如果可能,儘量平整它。 – TigerhawkT3

+0

x?.y - null條件成員訪問。如果左操作數爲null,則返回null。 這不說存在。 – saikumarm

+0

@ TigerhawkT3謝謝,我會盡可能地將它弄平。 – SDBot

回答

0

我回答我自己的問題,以便它可以標記爲已解決。

我目前正在使用這種方法,請讓我知道你是否有更好的解決方案。

>>> 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' 
1

這可能是個人喜好的問題,但有一個"better ask forgiveness than permission" school of thought在Python中,你的try/except適合那裏。 (我會那樣做,FWIW)

關於長表達式由於您的多重嵌套:

  1. 考慮,如果你確實需要這麼多嵌套在任何情況下。
  2. 如果您確實需要這麼多的嵌套,但訪問表達式太長,你可以打破它:

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

我儘量不要使用「try .. except」塊,因爲這樣的嵌套類太多了。 – SDBot

-1

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

+0

我的代碼是在python中,當我賦值value = first.second.third.forth.val時,我會得到AttributeError。 – SDBot

+0

那是什麼語言...... C#?這當然不是Python。 –