docstr: Get groupby selection columns from op parameters.
  If this returns None, it means all columns are required.
  Parameters
  ----------
  op
  
  Returns
  -------
docstr_tok: ["Get","groupby","selection","columns","from","op","parameters",".","If","this","returns","None",",","it","means","all","columns","are","required",".","Parameters","--","--","--","--","--","op","Returns","--","--","--","-"]
code: def _get_selection_columns(
      cls, op: DataFrameGroupByAgg
  ) -> Union[None, List]:
      """
      Get groupby selection columns from op parameters.
      If this returns None, it means all columns are required.
      Parameters
      ----------
      op
  
      Returns
      -------
  
      """
      if "selection" in op.groupby_params:
          selection = op.groupby_params["selection"]
          if isinstance(selection, (tuple, list)):
              selection = [n for n in selection]
          else:
              selection = [selection]
          return selection
  
file_path: mars/mars/dataframe/groupby/nunique.py
imports: from typing import List, Union
  import pandas
  from ...core import OutputType
  from ...utils import implements
  from .aggregation import DataFrameGroupByAgg
  from .custom_aggregation import DataFrameCustomGroupByAggMixin, register_custom_groupby_agg_func
label_desc: Use image node_id 2 for calling the DataFrameCustomGroupByNuniqueMixin obj's underlying member method code with example usage: obj._get_selection_columns(cls, op) and returns: selection