code: def canonicalize_version(version):
      
  
      try:
          version = Version(version)
      except InvalidVersion:
          # Legacy versions cannot be normalized
          return version
  
      parts = []
  
      # Epoch
      if version.epoch != 0:
          parts.append("{0}!".format(version.epoch))
  
      # Release segment
      # NB: This strips trailing '.0's to normalize
      parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release)))
  
      # Pre-release
      if version.pre is not None:
          parts.append("".join(str(x) for x in version.pre))
  
      # Post-release
      if version.post is not None:
          parts.append(".post{0}".format(version.post))
  
      # Development release
      if version.dev is not None:
          parts.append(".dev{0}".format(version.dev))
  
      # Local version segment
      if version.local is not None:
          parts.append("+{0}".format(version.local))
  
      return "".join(parts)
docs: This is very similar to Version.__str__, but has one subtle differences
      with the way it handles the release segment.