Страница 1 из 1

научите дурака писать функцию для field сalculator !

Добавлено: 07 сен 2015, 11:49
rapackivi
ЗАдача - по значению поля X установить значение в поле Y
Пытаюсь коде питона реализовать так:

pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'

Y=find(X)


Но выдает синтаксическую ошибку. Где я даю маху?

Re: научите дурака писать функцию для field сalculator !

Добавлено: 07 сен 2015, 12:59
Monstria
X,Y - тип поля какой?

Re: научите дурака писать функцию для field сalculator !

Добавлено: 07 сен 2015, 13:56
rapackivi
text

Re: научите дурака писать функцию для field сalculator !

Добавлено: 07 сен 2015, 22:20
Monstria
Спойлер
2015-09-07_22-15-12.jpg
2015-09-07_22-15-12.jpg (68.44 КБ) 7331 просмотр
На скрине не хватает последней строки кода: -"end if"

Re: научите дурака писать функцию для field сalculator !

Добавлено: 08 сен 2015, 06:15
Vaska72
rapackivi писал(а): pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'
Не проверял, но
1) после else не хватает двоеточия
2) внутри функции нельзя использовать названия полей, значение поля X передается в функцию как параметр. Соответственно должно быть if value=='sobaka':

Re: научите дурака писать функцию для field сalculator !

Добавлено: 08 сен 2015, 12:04
rapackivi
Monstria писал(а):На скрине не хватает последней строки кода: -"end if"
да, я понял - чтобы закрыть первый if.
Но Ваш код у меня не пошел(((( Я вообще не знаю VB - наверное, поэтому. Или я не корректно сформулировал задачу. В любом случае, интерестно было бы узнать реализацию и на VB
Конкретно, пробывал в таком виде:

Код: Выделить всё

dim s                   ' это, я так понимаю, объявление переменной s. 
                         'Причем, я не пойму - а тип определится автоматически?  
s= [age]                 ' припаяли значение поля age (геологический возраст объекта) переменной s
if not isnull(s) then  ' s - не нулевое? если да (а зачем эта доп.проверка?)
   if s='P2bc' then      'то проверяем s == P2bc ?  Если да,
      s='{щb]'               'то выставляем значение под шрифт отображения Geof
  end if
end if
Итак, s у нас теперь содержит либо ок либо ничего и это присваиваем новому полю TITLE Но это не работает(((( синтаксическую ошибку выдает


А вот замечания Vaska72 помогли запустить код на Python!
Vaska72 писал(а):Не проверял, но
1) после else не хватает двоеточия
да, это промазал как оформлял. Вообще оказалось что в моем случае ветка else - не нужна напрочь. Функция
сама возвращает без спроса у меня ноль
Vaska72 писал(а): 2) внутри функции нельзя использовать названия полей, значение поля X передается в функцию как параметр. Соответственно должно быть if value=='sobaka':
А вот вот это оказалось корнем зла моей проблемы :mrgreen:
Вот изучаешь язык, изучаешь. Читаешь, блин, про локальные глобальные переменные, функции, параметры функций... Все так понятно. Весь такой умный ходишь. А когда приходится попрактиковать - все эти знания лежат на дне сознания как куча хлама. И забываешь напрочь что там в использовании функции допустимо, а что нет.
Конечный код на питоне таков (может, кому пригодится).

Код: Выделить всё

def index(value):
    if value=='P3':
        return '}х'
    elif  value=='P2bc':      
        return '}зb['  
    elif  value=='P2kn':     
        return '}зkn'  
    elif  value=='P2kv':     
        return '}зkv'  
    elif  value=='N2':     
        return 'N2'  
    elif  value=='N1':     
        return 'N1'  
TITLE=index(age)

Re: научите дурака писать функцию для field сalculator !

Добавлено: 08 сен 2015, 17:43
Monstria
rapackivi писал(а):
Monstria писал(а):

Код: Выделить всё

if not isnull(s) then  ' s - не нулевое? если да (а зачем эта доп.проверка?)
Можно и не проверять, но если код будет более сложным, то многие функции сбоят если значение в них NULL
Monstria писал(а):

Код: Выделить всё

      s='{щb]'               'то выставляем значение под шрифт отображения Geof
Но это не работает(((( синтаксическую ошибку выдает
В VB символ ' обозначает начало комментария, для того что бы указать что оперируем строкой, строку необходимо ограничивать ". Т.е. запись должны быть такая:

Код: Выделить всё

s="{щb]"

Re: научите дурака писать функцию для field сalculator !

Добавлено: 09 сен 2015, 11:12
rapackivi
Monstria писал(а):МНЕ БОЛЕЕ ПО ДУШЕ VB - ДЛЯ НЕГО ТАК
Обнаружил у интерпретатора питона под аркгис очень неприятную проблему - если использовать в названиях полей знак подчеркивания - "_", то такой код будет интерпретироваться как синтаксически неверным.
В VB такой проблемы не наблюдается => буду учить VB, вернее вспоминать Basic :D

Re: научите дурака писать функцию для field сalculator !

Добавлено: 09 сен 2015, 12:28
dime1
Решил не создавать новую тему, тоже бодаюсь с if-else в Python. Выдаёт ошибку:
ERROR 999999: Error executing function.
The field is not nullable. [LC_Type]
LC_Type - тип текст, Value - long integer.
Код взят отсюда. Мне тоже нужно сделать подобное - заменить значения (23-100) из поля value и записать их в поле LC_Type. Заранее благодарен.

Pre-logic Script Code:

Код: Выделить всё

def calcVal(inVal):
  values = {23: "Developed, Open Space",
    24: "Forest",
    25: "Water",
    26: "Wetland"}
  if inVal in values.keys():
    return values[inVal]
  else:
    pass
LC_Type=

Код: Выделить всё

calcVal(!Value!)

Re: научите дурака писать функцию для field сalculator !

Добавлено: 09 сен 2015, 13:13
Ariki
А это потому что в ветке else у вас идёт pass вместо return. Функция возвращает None, а поле не поддерживает значение null. Вам нужно вернуть по умолчанию либо пустую строку, либо исходное значение LC_Type - смотря что вы хотите получить, если функции встретится значение, которого нет в словаре.

Кроме того, из вашего описания следует, что функции нужно передавать значение поля value, а вы передаёте LC_Type.

С помощью метода get можно сделать вообще в одну строчку:

Код: Выделить всё

LC_Type = {23: "Developed, Open Space", 24: "Forest", 25: "Water", 26: "Wetland"}.get(!value!, !LC_Type!)
Здесь первый параметр get() - ключ словаря, второй - значение, возвращаемое по умолчанию.

Re: научите дурака писать функцию для field сalculator !

Добавлено: 09 сен 2015, 13:36
dime1
Ariki, за вариант с get отдельное спасибо. Разобрался.