async def METHOD_NAME(
    self, external_address: str, from_who: Any = None, cached: bool = True, **kw
) -> Client:
    if cached and (external_address, from_who) in self._cache:
        cached_client = self._cache[external_address, from_who]
        if cached_client.closed:
            # closed before, ignore it
            del self._cache[external_address, from_who]
        else:
            return cached_client
    address = self.get_internal_address(external_address)
    if address is None:
        # no inner address, just use external address
        address = external_address
    client_type: Type[Client] = get_client_type(address)
    local_address = (
        self._curr_external_addresses[0] if self._curr_external_addresses else None
    )
    client = await client_type.connect(address, local_address=local_address, **kw)
    if cached:
        self._cache[external_address, from_who] = client
    return client