def __init__(self, abstract=False, extends=None, merges=None, type_alias=None, **kwargs):
    kwargs = _normalize_utf8_keys(kwargs)

    self._kwargs = kwargs

    self._kwargs['abstract'] = abstract
    self._kwargs[self._TYPE_ALIAS_FIELD] = type_alias

    self.extends = extends
    self.merges = merges

    # Allow for structs that are directly constructed in memory.  These can have an
    # address directly assigned (vs. inferred from name + source file location) and we only require
    # that if they do, their name - if also assigned, matches the address.
    if self.address:
      target_name, _, config_specifier = self.address.target_name.partition('@')
      if self.name and self.name != target_name:
        self.report_validation_error('Address and name do not match! address: {}, name: {}'
                                     .format(self.address, self.name))
      self._kwargs['name'] = target_name
Get the public IP of the head node.
dataset/ETHPy150Open pantsbuild/pants/src/python/pants/engine/exp/struct.py/Struct.__init__--crossover with--dataset/ETHPy150Open AppScale/appscale/lib/appscale_info.py/get_login_ip