2012-03-21 2 views
0

Я написал функцию, и я хотел бы вернуть переменную из этой функции, но я получаю сообщение об ошибкеВозвращаясь функция переменной ошибки ~ локальная переменная «пользователь» обращаться до присвоения ~, Python

локальная переменная ' пользователь»обращаться до присвоения

Моя функция:

def txtelm(): 

    # Updates date field to the current date 
    if textElement.name == "DATE": 
     textElement.text = strftime("%y %m %d") 

    if textElement.name == "CHECK": 
     textElement.text = "AB"   

    # First code block replaces the "Drawn" title block initials 
    if docauthor == "Mike" and textElement.name == "DRAWN": 
     textElement.text = "MM" 
     user = "mm" 
     #print user 

    elif docauthor == "Amy" and textElement.name == "DRAWN": 
     textElement.text = "AB" 
     user = "ab" 
     #print user 

    elif docauthor == "Ian" and textElement.name == "DRAWN": 
     textElement.text = "IB" 
     user = "ib" 

    elif docauthor == "Chris" and textElement.name == "DRAWN": 
     textElement.text = "CM" 
     user = "cm" 

    elif docauthor == "Cynthia" and textElement.name == "DRAWN": 
     textElement.text = "CC" 
     user = "cc" 

    return user 

Дальше мой код, я вызываю функцию:

for textElement in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"): 
     txtelm() 
     user = txtelm() 
     if textElement.name == "PATH": 
     textElement.text = outloc + "\\" + sitename.replace(" ", "_") + "_" + trunc + strftime("%d%b%y") + "_" + user 

Я установил некоторые печатные сообщения для печати «пользователь», но, похоже, ничего не возвращает. Прежде чем я создал функцию, у меня был код внутри нее, жестко закодированный под циклом «for», и это сработало ... поэтому я не понимаю, почему он не возвращает никаких значений.

Любые предложения?

+1

Немного легче читать форматирование текста: 'textElement.text = os.path.join (outloc,"% s_% s% s_% s "% (sitename.replace (" "," _ "), trunc, strftime («% d% b% y»), пользователь)) ' –

+0

Спасибо за это предложение Джейсон. – Mike

ответ

0

Я думаю, что ни одно из ваших утверждений if/elif не является истинным.

+0

Сделайте последнее 'else', где вы вызываете' exception'. Как это .. 'raise ValueError (docauthor, textElement.name)' – Doboy

0

Есть вероятность, что пользователь никогда не будет объявлен, прежде чем пытаться его вернуть. Установка пользователя как пустая строка в начале txtelm()

def txtelm(): 
    user = "" 

А затем проверить, если пользователь не является пустым

for textElement in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"): 
     txtelm() 
     user = txtelm() 
     if user == "": 
      #handle the error 
1

Ваша функция не принимает никаких аргументов, но использует переменную «TextElement». Вы должны определить свою функцию следующим образом:

txtelm(textElement): 

и называть его таким образом:

user = txtelm(textElement) 

значение TextElement из кода петли будут переданы в функцию.

Я не уверен, что первый вызов txtelm() для - он, кажется, ничего не делает.

Edit:

я говорил слишком рано - там есть несколько проблем. Сначала вышесказанное, затем определение «пользователь»: поскольку каждое определение находится в пределах «если», когда ни один из них не совпадает с ним, он не будет объявлен вообще. Добавить:

user = "" 

в начало вашей функции, чтобы предотвратить это.

Изменить еще раз: «docauthor» также не определен - возможно, это должен быть другой аргумент функции?

+0

Я на самом деле уже протестировал это, и я все еще получаю ту же ошибку .... – Mike

+0

Ах да, это потому, что ваш «возврат» выходит за рамки объявления (ы) пользователя. За другой ответ положите 'user = ""' в начало функции. – jimw

+0

Python не имеет области действия блока. –