# standard library imports
from operator import attrgetter
from typing import Union, Generator

# third-party library imports
from pandas import DataFrame
from spacy.tokens import Token, Span, Doc


def analyze_tokens(
    doclike: Union[Doc, Span],
    *attributes
) -> DataFrame:
    """
    Example:
        `analyze_tokens(doc, 'like_num', 'lemma_', 'pos_', 'children', '_.custom')`
    """
    columns = ('text', *attributes)   
    data = (
        (
            (*attribute,) if isinstance(attribute, Generator) else attribute 
            for attribute in attrgetter(*columns)(token)
        ) for token in doclike
    )
    return DataFrame(data=data, columns=columns).T