code: def __str__(self):
      # type: () -> str
      parts = []
  
      # Epoch
      if self.epoch != 0:
          parts.append("{0}!".format(self.epoch))
  
      # Release segment
      parts.append(".".join(str(x) for x in self.release))
  
      # Pre-release
      if self.pre is not None:
          parts.append("".join(str(x) for x in self.pre))
  
      # Post-release
      if self.post is not None:
          parts.append(".post{0}".format(self.post))
  
      # Development release
      if self.dev is not None:
          parts.append(".dev{0}".format(self.dev))
  
      # Local version segment
      if self.local is not None:
          parts.append("+{0}".format(self.local))
  
      return "".join(parts)
  
imports: from __future__ import absolute_import, division, print_function
  import collections
  import itertools
  import re
  import warnings
  from ._structures import Infinity, NegativeInfinity
  from ._typing import TYPE_CHECKING
label_desc: Use image node_id 3 for calling the Version obj's underlying member method code with example usage: obj.__str__() and returns: str