2013-02-25 74 views
2

在你寫下這篇文章之前,並沒有問過我能找到的任何地方。檢查一個變量是否存在於Python中 - 不適用於自己

我用

if 'self.locList' in locals(): 
    print 'it exists' 

檢查名單的存在,但它不工作。它從不認爲它存在。這一定是因爲我使用繼承和self.在其他地方引用它,我不明白髮生了什麼。

任何人都可以請一些光嗎?

下面是完整的代碼:

import maya.cmds as cmds 

class primWingS(): 
    def __init__(self): 
     pass 
    def setupWing(self, *args): 
     pass 
    def createLocs(self, list): 
     for i in range(list): 
    if 'self.locList' in locals(): 
     print 'it exists' 
      else: 
       self.locList = [] 
      loc = cmds.spaceLocator(n = self.lName('dummyLocator' + str(i + 1) + '_LOC')) 
      self.locList.append(loc) 
      print self.locList 


p = primWingS() 
+1

你能檢查你的代碼的縮進嗎?我想我可以告訴它應該如何,但很難說。 – Marius 2013-02-25 02:31:15

+2

爲什麼不在'__init__'裏面創建它,而不是每次都檢查? – wim 2013-02-25 02:32:27

回答

10

我想你想hasattr(self,'locList')

雖然,你平時最好嘗試使用屬性和追趕它被提出的AttributeError如果它不是」 t目前:

try: 
    print self.locList 
except AttributeError: 
    self.locList = "Initialized value" 
+2

+1:[Python EAFP idiom](http://docs.python.org/2/glossary.html#term-eafp)。 – Johnsyweb 2013-02-25 02:33:09

+0

@Johnsyweb - 是的,從性能的觀點來看,'try' -'except'幾乎肯定會擊敗'hasattr',因爲docs明確聲明'hasattr'是通過嘗試'getattr'來實現的,並且檢查異常... – mgilson 2013-02-25 02:47:17

1

您可以使用try/except或getattr的默認值,但這些東西對您的代碼沒有意義。 __init__方法用於初始化對象:

def __init__(self): 
    self.locList = [] 

允許locList不存在是沒有意義的。零長度列表是沒有位置的對象。

+0

把它放在init中是行不通的,它根本不知道有一個列表 – Vii 2013-02-25 02:55:45

+1

這是不正確的,init方法作爲設置類屬性的唯一目標。 – hdante 2013-02-25 03:09:14

+0

它看起來像破碎的縮進不僅在粘貼代碼。用正確的縮進來重寫createLocs方法,否則python將拒絕做你想做的事。 – hdante 2013-02-25 03:15:24

1

從一個不同的角度回答。 Try ... catch,getattrdir是要走的路,如果你只是想要的代碼工作。

呼叫locals()返回本地範圍的字典。這是它包括self。但是,您要求selfself.locList)的孩子。孩子根本就不在字典裏。最接近的事對你在做什麼,應該是:

if 'locList' in dir(self): 
    print 'it exists' 

功能dir被查詢對象的項目的通用方法。但正如其他文章中所指出的,從速度的角度來看查詢對象的屬性並沒有什麼意義。

相關問題