exec devuelve un no tipo, cuando necesito el valor de retorno

Hice una pregunta antes, pero me encontré con un segundo problema.

Estoy escribiendo un programa que lee en un archivo de texto y ejecuta todo el código dentro del archivo. Esto es para clase, y tenemos que usarexec()

Recibo este error al ejecutar el código, e innumerables búsquedas no me han llevado a una solución.

Traceback (most recent call last):
  File "doxecute.py", line 28, in <module>
    replace_code(statements, contents)
  File "doxecute.py", line 17, in replace_code
    contents = contents.replace("{%" + statement + "%}", statement)
TypeError: Can't convert 'NoneType' object to str implicitly

El código es

import sys
import re



def sortecute(data): 
    funcs = re.findall(r'{%(.*?)%}',data,re.DOTALL)#find executable statements
    return funcs

def replace_code(statements, contents):
    for statement in statements:
        if not statement[5:].startswith("print("):
            exec(statement[5:]) #execute code after the (letter)
            contents = contents.replace("{%" + statement + "%}", "")
        else:
            statement = exec(statement[5:])#error is here
            contents = contents.replace("{%" + statement + "%}", statement)

    print(contents)

f = open(sys.argv[1],"r")
contents = f.read()
f.close()

statements = sortecute(contents) #get data from file
statements  = sorted(statements) #sorts by letter

replace_code(statements, contents)

Este es el archivo que leí.

The number {% (c) print(x) %} is a random number between 1 and 6
inclusive. If we multiply it by 2, we get {% (d) print(2*x) %}.

What's interesting is that the statements may appear out of order in the
document. {% (a) import random %} Thus I might generate the random
number in a location in the document well after referencing it.
{% (b) x = random.randint(1,6) %}

No puedo averiguar cómo obtener el valor de la declaración para exec. ¿Puede alguien explicarme cómo usar esto correctamente de la manera que se detalla a continuación?

You will need to use the exec function in Python. To get the output back, you will need to redirect output to your own stream. Your program should accept a filename as a command-line argument to operate on [8]

Respuestas a la pregunta(1)

Su respuesta a la pregunta