Search code examples
pythonif-statementfieldarcgis

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.

2) The road type is a string found in the field "fclass" in the same table.

I open the field calculator for the SpeedLimit field and fill the following:

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 =

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

enter image description here

** THE ANSWER** I simply did not select the "Python" radio button... Thank you all for your assistance.


Solution

  • 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:

    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).