code: def NumExpr(ex, signature=(), **kwargs):
      
      # NumExpr can be called either directly by the end-user, in which case
      # kwargs need to be sanitized by getContext, or by evaluate,
      # in which case kwargs are in already sanitized.
      # In that case frame_depth is wrong (it should be 2) but it doesn't matter
      # since it will not be used (because truediv='auto' has already been
      # translated to either True or False).
  
      context = getContext(kwargs, frame_depth=1)
      threeAddrProgram, inputsig, tempsig, constants, input_names = precompile(ex, signature, context)
      program = compileThreeAddrForm(threeAddrProgram)
      return interpreter.NumExpr(inputsig.encode('ascii'),
                                 tempsig.encode('ascii'),
                                 program, constants, input_names)
docs: Compile an expression built using E.<variable> variables to a function.
  
      ex can also be specified as a string "2*a+3*b".
  
      The order of the input variables and their types can be specified using the
      signature parameter, which is a list of (name, type) pairs.
  
      Returns a `NumExpr` object containing the compiled function.