The gramex.yaml configuration uses functions in several places. For example, in:
function: keyprepare, queryfunction, function, and modify keyscondition keyWhenever gramex.yaml uses a function, it accepts any Python expression. For example:
url:
  example:
    pattern: /example
    handler: FunctionHandler
    kwargs:
      # Use **ONE** of these examples
      function: 1 + 2                     # Returns 3
      function: json.dumps(None)          # Returns "null"
      function: pd.read_csv('data.csv')   # Returns DataFrame
      function: myapp.myfunc(handler)
Gramex automatically imports modules, e.g. import mymodule in the above example.
Quote the expression. Else the YAML parser may misinterpret it. For example:
      function: json.dumps({"x": 1})    # Invalid YAML because of the colon (:)
      function: 'json.dumps({"x": 1})'  # Valid: quoted string
      function: >                       # Valid: multi-line string
        json.dumps({"x": 1})
You can also write a list of steps for a function. We call these pipelines. For example, to generate a random number in FunctionHandler:
url:
  random-function:
    pattern: /random
    handler: FunctionHandler
    kwargs:
      function:
        - random.seed(0)
        - random.randint(0, 100)
This pipeline (i.e. a function with multiple steps) has 2 steps.
When you visit /random, it always runs the 2 steps in order: random.seed(0) first, then random.randint(0, 100). It returns the same random number every time.
Visit /random
To assign the output of a step to a variable, use {name: ...}. For example:
url:
  random-sum:
    pattern: /randomsum
    handler: FunctionHandler
    kwargs:
      function:
        - { name: x, function: random.randint(0, 100) }
        - { name: y, function: random.randint(0, 100) }
        - x + y
The output will be the sum of 2 random numbers between 0-100 that changes on every reload.
Visit /randomsum