Возврат функциональной переменной error ~ локальная переменная 'user', на которую есть ссылка перед присваиванием ~, Python - PullRequest
0 голосов
/ 22 марта 2012

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

локальная переменная "user", на которую ссылается перед присваиванием

Моя функция:

    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

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

Есть предложения?

Ответы [ 3 ]

1 голос
/ 22 марта 2012

Ваша функция не принимает аргументов, но использует переменную 'textElement'. Вам нужно определить свою функцию таким образом:

txtelm(textElement):

и назовите его так:

user = txtelm(textElement)

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

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

Edit:

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

user = ""

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

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

0 голосов
/ 22 марта 2012

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

def txtelm():
   user = ""

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

for textElement in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
        txtelm()
        user = txtelm()
        if user == "":
           #handle the error
0 голосов
/ 22 марта 2012

Полагаю, ни одно из ваших if/elif утверждений не соответствует действительности.

...