2013-02-25 3 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

+2

Почему вы не создаете его внутри '__init__', а не проверяете каждый раз? – wim

ответ

10

Я думаю, что вы хотите hasattr(self,'locList')

Хотя, вы, как правило, лучше попытаться использовать атрибут и поймать AttributeError, который получает поднятую если он ISN» t настоящее время:

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

+1: для [Идиомы [Python EAFP] (http://docs.python.org/2/glossary.html#term-eafp). – Johnsyweb

+0

@Johnsyweb - да, с точки зрения производительности, 'try'-'except' почти наверняка будет бить' hasattr', поскольку в документах явно указано, что 'hasattr' реализуется путем попытки getattr и проверки исключений ... – mgilson

1

Вы можете использовать try/except или getattr со значением по умолчанию, но эти вещи не имеют смысла с вашим кодом. Метод __init__ есть для инициализации объекта:

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

Это не имеет никакого смысла, чтобы позволить locList не существовать. Список нулевой длины - это объект без местоположений.

+0

не вставляя его в init, он не распознает, что есть список вообще – Vii

+1

Неправильно, метод init имеет единственную цель для настройки атрибутов класса. – hdante

+0

Похоже, сломанный отступ не только в вставленном коде. Перепишите метод createLocs с правильным отступом, иначе python откажется делать то, что вы хотите. – hdante

1

Ответ от немного другой точки зрения. Try ... catch, getattr или dir - это путь, если вы просто хотите, чтобы код работал.

Вызов locals() возвращает словарь локального объема. То есть он включает self. Однако вы просите ребенка от self (self.locList). Ребенок просто не в словаре. Ближе всего к тому, что вы делаете, будет:

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

функция dir является общим способом запроса элементов объектов. Но, как отмечено в других сообщениях, нет смысла запрашивать атрибуты объектов с точки зрения скорости.

Смежные вопросы