class_docstr: Represents a histogram over numbers.
  
  Attributes:
      name: unique name of the histogram which represents the histogram type.
      bins: histogram bins.
      lower: lower bound of the whole histogram, always included and always
        equals to 1 for integer histograms, None if there are no bins in the
        histogram.
      upper: upper bound of the whole histogram, there is no upper for integer
        histograms (i.e. +inf) and for floating histograms upper exists and is
        always included, None if there are no bins in the histogram.
class_docstr_tok: ["Represents","a","histogram","over","numbers",".","Attributes",":","name",":","unique","name","of","the","histogram","which","represents","the","histogram","type",".","bins",":","histogram","bins",".","lower",":","lower","bound","of","the","whole","histogram",",","always","included","and","always","equals","to","1","for","integer","histograms",",","None","if","there","are","no","bins","in","the","histogram",".","upper",":","upper","bound","of","the","whole","histogram",",","there","is","no","upper","for","integer","histograms","(","i.e",".","+inf",")","and","for","floating","histograms","upper","exists","and","is","always","included",",","None","if","there","are","no","bins","in","the","histogram","."]
code: def __post_init__(self):
      if len(self.bins) == 0:
          self.lower = self.upper = None
      else:
          self.lower = 1 if self.is_integer else self.bins[0].lower
          self.upper = None if self.is_integer else self.bins[-1].upper
  
file_path: pipelinedp/pipeline_dp/dataset_histograms/histograms.py
imports: from dataclasses import dataclass, field
  import enum
  from typing import List, Sequence, Tuple, Union
label_desc: Use image node_id 1 for calling the Histogram obj's underlying member method code with example usage: obj.__post_init__() without return types