(an_obj:EucOrTuple, intended_class:type=Vector3)
Accept an object or list of objects of any relevant type (2-tuples, 3-tuples, Vector2/3, Point2/3)
    and return one or more euclid3 objects of intended_class. 

    # -- 3D input has its z-values dropped when intended_class is 2D
    # -- 2D input has its z-values set to 0 when intended_class is 3D

    The general idea is to take in data in whatever form is handy to users
    and return euclid3 types with vector math capabilities
Accept an object or list of objects of any relevant type (2-tuples, 3-tuples, Vector2/3, Point2/3)
    and return one or more euclid3 objects of intended_class.
Accept an object or list of objects of any relevant type ( 2 - tuples 3 - tuples Vector2 / 3 Point2 / 3 ) and return one or more euclid3 objects of intended_class .
def euclidify(an_obj:EucOrTuple, intended_class:type=Vector3) -> Union[Point23, Vector23, List[Union[Point23, Vector23]]]:
    '''
    Accept an object or list of objects of any relevant type (2-tuples, 3-tuples, Vector2/3, Point2/3)
    and return one or more euclid3 objects of intended_class. 

    # -- 3D input has its z-values dropped when intended_class is 2D
    # -- 2D input has its z-values set to 0 when intended_class is 3D

    The general idea is to take in data in whatever form is handy to users
    and return euclid3 types with vector math capabilities
    '''
    sequence = (list, tuple)
    euclidable = (list, tuple, Vector2, Vector3, Point2, Point3)
    numeric = (int, float)
    # If this is a list of lists, return a list of euclid objects
    if isinstance(an_obj, sequence) and isinstance(an_obj[0], euclidable):
        return list((_euc_obj(ao, intended_class) for ao in an_obj))
    elif isinstance(an_obj, euclidable):
        return _euc_obj(an_obj, intended_class)
    else:
        raise TypeError(f'''Object: {an_obj} ought to be PyEuclid class 
                        {intended_class.__name__} or able to form one, but is not.''')
def euclidify ( an_obj : EucOrTuple , intended_class : type = Vector3 ) -> Union [ Point23 , Vector23 , List [ Union [ Point23 , Vector23 ] ] ] : sequence = ( list , tuple ) euclidable = ( list , tuple , Vector2 , Vector3 , Point2 , Point3 ) numeric = ( int , float ) # If this is a list of lists, return a list of euclid objects if isinstance ( an_obj , sequence ) and isinstance ( an_obj [ 0 ] , euclidable ) : return list ( ( _euc_obj ( ao , intended_class ) for ao in an_obj ) ) elif isinstance ( an_obj , euclidable ) : return _euc_obj ( an_obj , intended_class ) else : raise TypeError ( f'''Object: {an_obj} ought to be PyEuclid class 
                        {intended_class.__name__} or able to form one, but is not.''' )