_get_item_value - Returns the value of a given field on #item, using either dict style (e.x. x['a']) aka __getitem__ access if possible,
              otherwise attribute access (aka implements __getattribute__).

              This allows you to pass a mix of object types, or objects and dicts, in the same collection.

                @param item <???> - The item that needs a value fetched off it. items must support either __getitem__ or __getattribute__
                @param fieldName <str> - The name of the field on that item which is being requested

            NOTE: if __getitem__ is defined, it will be used, otherwise __getattribute__ will be used.

            @return - The value of the #fieldName key/attribute on #item

def _get_item_value(item, fieldName):
        '''
            _get_item_value - Returns the value of a given field on #item, using either dict style (e.x. x['a']) aka __getitem__ access if possible,
              otherwise attribute access (aka implements __getattribute__).

              This allows you to pass a mix of object types, or objects and dicts, in the same collection.

                @param item <???> - The item that needs a value fetched off it. items must support either __getitem__ or __getattribute__
                @param fieldName <str> - The name of the field on that item which is being requested

            NOTE: if __getitem__ is defined, it will be used, otherwise __getattribute__ will be used.

            @return - The value of the #fieldName key/attribute on #item
        '''

        if hasattr(item, '__getitem__'):
            return QueryableListDicts._get_item_value(item, fieldName)

        return QueryableListObjs._get_item_value(item, fieldName)