class_docstr: This descriptor class add type and value checking informations to the _Col
  instance for future usage in the DFtoVW class. Indeed, the type and value checking
  can only be done once the dataframe is known (i.e in DFtoVW class). This descriptor
  class is used in the following managed class: SimpleLabel, MulticlassLabel, Feature, etc.
class_docstr_tok: ["This","descriptor","class","add","type","and","value","checking","informations","to","the","_Col","instance","for","future","usage","in","the","DFtoVW","class",".","Indeed",",","the","type","and","value","checking","can","only","be","done","once","the","dataframe","is","known","(","i.e","in","DFtoVW","class",")",".","This","descriptor","class","is","used","in","the","following","managed","class",":","SimpleLabel",",","MulticlassLabel",",","Feature",",","etc","."]
docstr: Implement set protocol to enforce type (and value range) checking
  for managed class such as SimpleLabel, MulticlassLabel, Feature, etc.
  
  Args:
      instance: The managed instance.
      arg: The argument to set.
docstr_tok: ["Implement","set","protocol","to","enforce","type","(","and","value","range",")","checking","for","managed","class","such","as","SimpleLabel",",","MulticlassLabel",",","Feature",",","etc",".","Args",":","instance",":","The","managed","instance",".","arg",":","The","argument","to","set","."]
code: def __set__(self, instance: Any, arg: str) -> None:
      """Implement set protocol to enforce type (and value range) checking
      for managed class such as SimpleLabel, MulticlassLabel, Feature, etc.
  
      Args:
          instance: The managed instance.
          arg: The argument to set.
      """
      # initialize empty set that register the column names
      if "columns" not in instance.__dict__:
          instance.__dict__["columns"] = set()
  
      if arg is None:
          instance.__dict__[self.attribute_name] = arg
      else:
          arg_is_list = isinstance(arg, list)
          colnames = arg if arg_is_list else [arg]
          instance.__dict__["columns"].update(colnames)
          instance.__dict__[self.attribute_name] = [
              _Col(
                  colname=col,
                  expected_type=self.expected_type,
                  min_value=self.min_value,
                  max_value=self.max_value,
              )
              for col in colnames
          ]
  
          if not arg_is_list:
              instance.__dict__[
                  self.attribute_name
              ] = instance.__dict__[self.attribute_name][0]
  
imports: import warnings
  import numpy
  import pandas
  from typing import Any, Hashable, List, Optional, Tuple, Type, Union
label_desc: Use image node_id 2 for calling the _AttributeDescriptor obj's underlying member method code with example usage: obj.__set__(instance, arg) without return types