научите дурака писать функцию для field сalculator !
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 25 июн 2015, 12:34
- Репутация: 2
научите дурака писать функцию для field сalculator !
ЗАдача - по значению поля X установить значение в поле Y
Пытаюсь коде питона реализовать так:
pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'
Y=find(X)
Но выдает синтаксическую ошибку. Где я даю маху?
Пытаюсь коде питона реализовать так:
pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'
Y=find(X)
Но выдает синтаксическую ошибку. Где я даю маху?
-
- Активный участник
- Сообщения: 133
- Зарегистрирован: 17 май 2011, 06:22
- Репутация: 50
- Откуда: Нижний Новгород
Re: научите дурака писать функцию для field сalculator !
X,Y - тип поля какой?
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 25 июн 2015, 12:34
- Репутация: 2
-
- Активный участник
- Сообщения: 133
- Зарегистрирован: 17 май 2011, 06:22
- Репутация: 50
- Откуда: Нижний Новгород
Re: научите дурака писать функцию для field сalculator !
Спойлер
-
- Интересующийся
- Сообщения: 26
- Зарегистрирован: 03 янв 2012, 18:49
- Репутация: 13
- Откуда: Тюмень
Re: научите дурака писать функцию для field сalculator !
Не проверял, ноrapackivi писал(а): pre-logic script code:
def find(value):
if !X!=='sobaka':
return 'nadpisy'
else return '0'
1) после else не хватает двоеточия
2) внутри функции нельзя использовать названия полей, значение поля X передается в функцию как параметр. Соответственно должно быть if value=='sobaka':
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 25 июн 2015, 12:34
- Репутация: 2
Re: научите дурака писать функцию для field сalculator !
да, я понял - чтобы закрыть первый if.Monstria писал(а):На скрине не хватает последней строки кода: -"end 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
Код: Выделить всё
TITLE=s
А вот замечания Vaska72 помогли запустить код на Python!
да, это промазал как оформлял. Вообще оказалось что в моем случае ветка else - не нужна напрочь. ФункцияVaska72 писал(а):Не проверял, но
1) после else не хватает двоеточия
сама возвращает без спроса у меня ноль
А вот вот это оказалось корнем зла моей проблемыVaska72 писал(а): 2) внутри функции нельзя использовать названия полей, значение поля X передается в функцию как параметр. Соответственно должно быть if value=='sobaka':

Вот изучаешь язык, изучаешь. Читаешь, блин, про локальные глобальные переменные, функции, параметры функций... Все так понятно. Весь такой умный ходишь. А когда приходится попрактиковать - все эти знания лежат на дне сознания как куча хлама. И забываешь напрочь что там в использовании функции допустимо, а что нет.
Конечный код на питоне таков (может, кому пригодится).
Код: Выделить всё
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'
-
- Активный участник
- Сообщения: 133
- Зарегистрирован: 17 май 2011, 06:22
- Репутация: 50
- Откуда: Нижний Новгород
Re: научите дурака писать функцию для field сalculator !
В VB символ ' обозначает начало комментария, для того что бы указать что оперируем строкой, строку необходимо ограничивать ". Т.е. запись должны быть такая:rapackivi писал(а):Можно и не проверять, но если код будет более сложным, то многие функции сбоят если значение в них NULLMonstria писал(а):Код: Выделить всё
if not isnull(s) then ' s - не нулевое? если да (а зачем эта доп.проверка?)
Monstria писал(а):Но это не работает(((( синтаксическую ошибку выдаетКод: Выделить всё
s='{щb]' 'то выставляем значение под шрифт отображения Geof
Код: Выделить всё
s="{щb]"
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 25 июн 2015, 12:34
- Репутация: 2
Re: научите дурака писать функцию для field сalculator !
Обнаружил у интерпретатора питона под аркгис очень неприятную проблему - если использовать в названиях полей знак подчеркивания - "_", то такой код будет интерпретироваться как синтаксически неверным.Monstria писал(а):МНЕ БОЛЕЕ ПО ДУШЕ VB - ДЛЯ НЕГО ТАК
В VB такой проблемы не наблюдается => буду учить VB, вернее вспоминать Basic

-
- Гуру
- Сообщения: 939
- Зарегистрирован: 29 май 2011, 19:41
- Репутация: 94
- Откуда: Киев
Re: научите дурака писать функцию для field сalculator !
Решил не создавать новую тему, тоже бодаюсь с if-else в Python. Выдаёт ошибку:
Код взят отсюда. Мне тоже нужно сделать подобное - заменить значения (23-100) из поля value и записать их в поле LC_Type. Заранее благодарен.
Pre-logic Script Code:LC_Type=
LC_Type - тип текст, Value - long integer.ERROR 999999: Error executing function.
The field is not nullable. [LC_Type]
Код взят отсюда. Мне тоже нужно сделать подобное - заменить значения (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
Код: Выделить всё
calcVal(!Value!)
Последний раз редактировалось dime1 09 сен 2015, 13:44, всего редактировалось 1 раз.
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: научите дурака писать функцию для field сalculator !
А это потому что в ветке else у вас идёт pass вместо return. Функция возвращает None, а поле не поддерживает значение null. Вам нужно вернуть по умолчанию либо пустую строку, либо исходное значение LC_Type - смотря что вы хотите получить, если функции встретится значение, которого нет в словаре.
Кроме того, из вашего описания следует, что функции нужно передавать значение поля value, а вы передаёте LC_Type.
С помощью метода get можно сделать вообще в одну строчку:
Здесь первый параметр get() - ключ словаря, второй - значение, возвращаемое по умолчанию.
Кроме того, из вашего описания следует, что функции нужно передавать значение поля value, а вы передаёте LC_Type.
С помощью метода get можно сделать вообще в одну строчку:
Код: Выделить всё
LC_Type = {23: "Developed, Open Space", 24: "Forest", 25: "Water", 26: "Wetland"}.get(!value!, !LC_Type!)
-
- Гуру
- Сообщения: 939
- Зарегистрирован: 29 май 2011, 19:41
- Репутация: 94
- Откуда: Киев
Re: научите дурака писать функцию для field сalculator !
Ariki, за вариант с get отдельное спасибо. Разобрался.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость