<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def ip_address(self, **kwargs):
 """ Set IP Address on an Interface. Args: int_type (str):
 Type of interface. (gigabitethernet, tengigabitethernet etc). name (str):
 Name of interface id. (For interface: 1/0/5, 1/0/10 etc). ip_addr (str):
 IPv4/IPv6 Virtual IP Address.. Ex: 10.10.10.1/24 or 2001:db8::/48 delete (bool):
 True is the IP address is added and False if its to be deleted (True, False). Default value will be False if not specified. rbridge_id (str):
 rbridge-id for device. Only required when type is `ve`. get (bool):
 Get config instead of editing config. (True, False) callback (function):
 A function executed upon completion of the method. The only parameter passed to `callback` will be the ``ElementTree`` `config`. Returns: Return value of `callback`. Raises: KeyError: if `int_type`, `name`, or `ip_addr` is not passed. ValueError: if `int_type`, `name`, or `ip_addr` are invalid. Examples: """


        int_type = str(kwargs.pop('int_type').lower())
        name = str(kwargs.pop('name'))
        ip_addr = str(kwargs.pop('ip_addr'))
        delete = kwargs.pop('delete', False)
        rbridge_id = kwargs.pop('rbridge_id', '1')
        callback = kwargs.pop('callback', self._callback)
        valid_int_types = ['gigabitethernet', 'tengigabitethernet', 've',
                           'fortygigabitethernet', 'hundredgigabitethernet',
                           'loopback']

        if int_type not in valid_int_types:
            raise ValueError('int_type must be one of: %s' %
                             repr(valid_int_types))

        ipaddress = ip_interface(unicode(ip_addr))
        ip_args = dict(name=name, address=ip_addr)
        method_name = None
        method_class = self._interface
        if ipaddress.version == 4:
            method_name = 'interface_%s_ip_ip_config_address_' \
                          'address' % int_type
        elif ipaddress.version == 6:
            method_name = 'interface_%s_ipv6_ipv6_config_address_ipv6_' \
                          'address_address' % int_type

        if int_type == 've':
            method_name = "rbridge_id_%s" % method_name
            method_class = self._rbridge
            ip_args['rbridge_id'] = rbridge_id
            if not pynos.utilities.valid_vlan_id(name):
                raise InvalidVlanId("`name` must be between `1` and `8191`")
        elif int_type == 'loopback':
            method_name = 'rbridge_id_interface_loopback_ip_ip_config_' \
                          'address_address'
            if ipaddress.version == 6:
                method_name = 'rbridge_id_interface_loopback_ipv6_ipv6_' \
                              'config_address_ipv6_address_address'
            method_class = self._rbridge
            ip_args['rbridge_id'] = rbridge_id
            ip_args['id'] = name
        elif not pynos.utilities.valid_interface(int_type, name):
            raise ValueError('`name` must be in the format of x/y/z for '
                             'physical interfaces.')

        ip_address_attr = getattr(method_class, method_name)
        config = ip_address_attr(**ip_args)
        if delete:
            config.find('.//*address').set('operation', 'delete')
        try:
            if kwargs.pop('get', False):
                return callback(config, handler='get_config')
            else:
                return callback(config)
        # TODO Setting IP on port channel is not done yet.
        except AttributeError:
            return None