<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def drop_udf( self, name, input_types=None, database=None, force=False, aggregate=False, ):
 """ Drops a UDF If only name is given, this will search for the relevant UDF and drop it. To delete an overloaded UDF, give only a name and force=True Parameters name : string input_types : list of strings (optional) force : boolean, default False Must be set to true to drop overloaded UDFs database : string, default None aggregate : boolean, default False """

        if not input_types:
            if not database:
                database = self.current_database
            result = self.list_udfs(database=database, like=name)
            if len(result) > 1:
                if force:
                    for func in result:
                        self._drop_single_function(
                            func.name,
                            func.inputs,
                            database=database,
                            aggregate=aggregate,
                        )
                    return
                else:
                    raise Exception(
                        "More than one function "
                        + "with {0} found.".format(name)
                        + "Please specify force=True"
                    )
            elif len(result) == 1:
                func = result.pop()
                self._drop_single_function(
                    func.name,
                    func.inputs,
                    database=database,
                    aggregate=aggregate,
                )
                return
            else:
                raise Exception("No function found with name {0}".format(name))
        self._drop_single_function(
            name, input_types, database=database, aggregate=aggregate
        )