code: def _get_avro_type(val):
      
      if isinstance(val, dict):
          assert val.get("class") == "File" or "File" in val.get("class")
          return "File"
      elif isinstance(val, (tuple, list)):
          types = []
          for ctype in [_get_avro_type(v) for v in val]:
              if isinstance(ctype, dict):
                  nested_types = [x["items"] for x in types if isinstance(x, dict)]
                  if ctype["items"] not in nested_types:
                      if isinstance(ctype["items"], (list, tuple)):
                          for t in ctype["items"]:
                              if t not in types:
                                  types.append(t)
                      else:
                          if ctype not in types:
                              types.append(ctype)
              elif isinstance(ctype, (list, tuple)):
                  for x in ctype:
                      if x not in types:
                          types.append(x)
              elif ctype not in types:
                  types.append(ctype)
          # handle empty types, allow null
          if len(types) == 0:
              types = ["null"]
              # empty lists
              if isinstance(val, (list, tuple)) and len(val) == 0:
                  types.append({"type": "array", "items": ["null"]})
          types = _avoid_duplicate_arrays(types)
          # Avoid empty null only arrays which confuse some runners
          if len(types) == 1 and types[0] == "null":
              types.append("string")
          return {"type": "array", "items": (types[0] if len(types) == 1 else types)}
      elif val is None:
          return ["null"]
      # encode booleans as string True/False and unencode on other side
      elif isinstance(val, bool) or isinstance(val, six.string_types) and val.lower() in ["true", "false", "none"]:
          return ["string", "null", "boolean"]
      elif isinstance(val, int):
          return "long"
      elif isinstance(val, float):
          return "double"
      else:
          return "string"
docs: Infer avro type for the current input.