Передача переменной внутри функции в переменную вне функции - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь установить новую переменную для ссылки на переменную внутри функции. Мой псевдокод выглядит так:

def myfunction():
   a bunch of stuff that results in
   myvariable = "Some Text"

Далее код, у меня есть это:

for something in somethinglist:
   if something == iteminsomethinglist:
       myfunction()
       mynewvariable1 = myvariable
   elif something == iteminsomethinglist:
       myfunction()
       mynewvariable2 = myvariable
   else:
       mynewvariable3 = myvariable

Я получаю сообщение об ошибке, в котором говорится что-то вроде: имя 'myvariable' не определено

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

Редактировать: Я прилагаю свой код, потому что он был недостаточно понятен в моем первом посте. В моей функции есть переменная, на которую я хотел сослаться (на самом деле их 2). Я прошу прощения за то, что не дал достаточно ясного объяснения. Хотя мой оригинальный код psuedo предложил этот вопрос достаточно хорошо. У меня также есть ощущение, что это не лучший подход. Возможен ли вызов 2-х функций? Мой код ниже:

def datetypedetector():

    rows = arcpy.SearchCursor(fc)

    dateList = []

    for row in rows:
        dateList.append(row.getValue("DATE_OBSERVATION").strftime('%m-%d-%Y'))

    del row, rows

    newList = sorted(list(set(dateList)))

    dates = [datetime.strptime(d, "%m-%d-%Y") for d in newList]

    date_ints = set([d.toordinal() for d in dates])

    if len(date_ints) == 1:
        DTYPE = "Single Date"
        #print "Single Date"
    elif max(date_ints) - min(date_ints) == len(date_ints) - 1:
        DTYPE = "Range of Dates"
        #print "Range of Dates"
    else:
        DTYPE = "Multiple Dates"
        #print "Multiple Dates"

    fcList = arcpy.ListFeatureClasses()

for fc in fcList:

    if fc == "SO_SOIL_P" or fc == "AS_ECOSITE_P":
        datetypedetector()
        ssDate = newList
        print fc + " = " + str(ssDate)
        ssDatetype = DTYPE
        print ssDatetype

    elif fc == "VE_WEED_P":
        datetypedetector()
        vwDate = newList
        print fc + " = " + str(vwDate)
        vwDatetype = DTYPE
        print vwDatetype

    else: 
        datetypedetector()
        vrDate = newList
        print fc + " = " + str(vrDate)
        vrDatetype = DTYPE
        print vrDatetype

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Как написано, myvariable определяется только в области действия myfunction.
Чтобы сделать значение в этой переменной доступным вне функции, вы можете вернуть его из функции:

def myfunction():
    myvariable = "Some Text"
    return myvariable

А затем используйте его позже, как это:

for something in somethinglist:
    if something == iteminsomethinglist:
        mynewvariable1 = myfunction()

Редактировать: новая информация добавлена ​​к вопросу.

Ваш отступ выглядит немного не так, но это может быть просто копировать-вставитьпроблема.
Я думаю, что вы хотите сделать что-то вроде этого:

  1. Вызвать функцию datetypedetector, принимая fc в качестве аргумента.
  2. Return DTYPEиз этой функции для последующего использования.

Поэтому сначала измените сигнатуру функции на:

def datetypedetector(fc):
                     ^^

И окончательный оператор в datetypedetector на:

    return DTYPE

А затем передайте fc в качестве аргумента при его вызове, и последний шаг - вернуть DTYPE из функции, присвоив ей datetypedetector возвращаемое значение.

for fc in fcList:
    if fc == "SO_SOIL_P" or fc == "AS_ECOSITE_P":
        DTYPE = datetypedetector(fc)
        ...
1 голос
/ 07 марта 2012

Гораздо лучший способ организовать код - сделать что-то вроде этого:

def myfunction():
   return "Some Text"

for something in somethinglist:
   if something == iteminsomethinglist:
       mynewvariable1 = myfunction()
   elif something == iteminsomethinglist:
       mynewvariable2 = myfunction()
   else:
       mynewvariable3 = myfunction()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...