简体   繁体   English

ArcGIS字段计算器中的Python语法错误

[英]Python Syntax error in ArcGIS field calculator

I've been unable to get a simple block of code and am hoping someone can spot what is wrong. 我一直无法获得一个简单的代码块,希望有人能发现问题所在。 I feel like I'm blind. 我觉得我是盲人。

1) I create a new short integer field called "SpeedLimit" in my ArcGIS attribute table that signifies the speed limit for a road type. 1)我在ArcGIS属性表中创建了一个新的短整数字段,称为“ SpeedLimit”,它表示道路类型的速度限制。

2) The road type is a string found in the field "fclass" in the same table. 2)道路类型是在同一表的“ fclass”字段中找到的字符串。

I open the field calculator for the SpeedLimit field and fill the following: 我打开SpeedLimit字段的字段计算器,并填写以下内容:

Pre-Logic Script Code: 逻辑前脚本代码:

def Speed(class):
    if (class == ‘secondary’ or class == ‘tertiary’ or class == ‘trunk’ or class == ‘motorway’ or class == ‘primary’):
        return 70
    elif (class == ‘secondary_link’ or class == ‘tertiary_link’ or class == ‘trunk_link’ or class == ‘motorway_link’ or class == ‘primary_link’):
        return 45
    elif (class == ‘service’ or class == ‘track_grade1’ or class == ‘track_grade2’ or class == ‘track_grade3’ or class == ‘track_grade4’ or class == ‘track_grade5’):
        return 15       
    else:
        return 30

SpeedLimit = SpeedLimit =

Speed(!fclass!)

Can anyone spot what I'm doing wrong to receive a syntax error? 谁能发现我在做错的错误,从而收到语法错误?

Edit in response to the comments: I am receiving the error from running a shorter and simpler code: 根据评论进行编辑:我通过运行更短,更简单的代码收到错误:

def Speed(road):
    if (road == 'secondary'):   
        return 70
    else:
        return 30

在此处输入图片说明

** THE ANSWER** I simply did not select the "Python" radio button... Thank you all for your assistance. **答案**我只是没有选择“ Python”单选按钮...谢谢大家的帮助。

class is a reserved word in Python, so you should choose a different name for your parameter, eg, cls . class是Python中的保留字,因此您应该为参数选择其他名称,例如cls Additionally, and I'm not sure if this is a real problem in your code or just a copy-paste-to-SO issue, the quote character is ' , not ' . 另外,我不确定这是代码中的实际问题还是仅是复制粘贴至SO问题,所以引号是' ,不是' If we bring it all together, this code should work properly: 如果我们将所有这些放在一起,则此代码应该可以正常工作:

def speed(cls):
    if (cls == 'secondary' or cls == 'tertiary' or cls == 'trunk' or cls == 'motorway' or cls == 'primary'):
        return 70
    elif (cls == 'secondary_link' or cls == 'tertiary_link' or cls == 'trunk_link' or cls == 'motorway_link' or cls == 'primary_link'):
        return 45
    elif (cls == 'service' or cls == 'track_grade1' or cls == 'track_grade2' or cls == 'track_grade3' or cls == 'track_grade4' or cls == 'track_grade5'):
        return 15       
    else:
        return 30

You probably wanted this: 您可能想要这样:

def speed(aClass):
    if (aClass == 'secondary' or aClass == 'tertiary' or aClass == 'trunk' or aClass == 'motorway' or aClass == 'primary'):
        return 70
    elif (aClass == 'secondary_link' or aClass == 'tertiary_link' or aClass == 'trunk_link' or aClass == 'motorway_link' or aClass == 'primary_link'):
        return 45
    elif (aClass == 'service' or aClass == 'track_grade1' or aClass == 'track_grade2' or aClass == 'track_grade3' or aClass == 'track_grade4' or aClass == 'track_grade5'):
        return 15       
    else:
        return 30

fclass = 'tertiary_link'

print(speed(fclass))

but in Python is more elegant this: 但在Python中,这更优雅:

def speed(aClass):
    if aClass in ['secondary', 
                  'tertiary', 
                  'trunk', 
                  'motorway', 
                  'primary']:
        return 70

    if aClass in ['secondary_link', 
                  'tertiary_link', 
                  'trunk_link', 
                  'motorway_link', 
                  'primary_link']:
        return 45

    if aClass in ['service',
                  'track_grade1', 
                  'track_grade2',
                  'track_grade3',  
                  'track_grade4', 
                  'track_grade5']:
        return 15 

    else:
        return 30


fclass = 'tertiary_link'    # Only for testing

print(speed(fclass))

Note that instead elif I used if as every your branch returns a value (so the next statements are skipped). 请注意, if您的每个分支都返回一个值(因此跳过下一个语句),则使用elif代替。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM