docs: def create_unary_node(self, operator, child, param=None, schema=None):
          """
          Return a Unary Node whose type depends on the specified operator.
  
          :param schema:
          :param child:
          :param operator: A relational algebra operator (see constants.py)
          :param param: A list of parameters for the operator.
          :return: A Unary Node.
          """
  
          if operator == self.grammar.syntax.select_op:
              conditions = ' '.join(flatten(param))
              node = SelectNode(child, conditions)
  
          elif operator == self.grammar.syntax.project_op:
              node = ProjectNode(child, param)
  
          elif operator == self.grammar.syntax.rename_op:
              name = None
              attributes = []
              if isinstance(param[0], str):
                  name = param.pop(0)
              if param:
                  attributes = param[0]
              node = RenameNode(child, name, attributes, schema)
  
          elif operator == self.grammar.syntax.assign_op:
              name = param[0]
              attributes = [] if len(param) < 2 else param[1]
              node = AssignNode(child, name, attributes, schema)
  
          else:
              raise ValueError
  
          return node