<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def missing_property_names(self):
 """ Returns a list of properties which are required and missing. Properties are excluded from this list if they are allowed to be null. :return: list of missing properties. """


        propname = lambda x: self.__prop_names__[x]
        missing = []
        for x in self.__required__:

            # Allow the null type
            propinfo = self.propinfo(propname(x))
            null_type = False
            if 'type' in propinfo:
                type_info = propinfo['type']
                null_type = (type_info == 'null'
                             or isinstance(type_info, (list, tuple))
                             and 'null' in type_info)
            elif 'oneOf' in propinfo:
                for o in propinfo['oneOf']:
                    type_info = o.get('type')
                    if type_info and type_info == 'null' \
                            or isinstance(type_info, (list, tuple)) \
                            and 'null' in type_info:
                        null_type = True
                        break

            if (propname(x) not in self._properties and null_type) or \
                    (self._properties[propname(x)] is None and not null_type):
                missing.append(x)

        return missing