class_docstr: This class abstracts handling of a project's versions.
  
  A :class:`Version` instance is comparison aware and can be compared and
  sorted using the standard Python interfaces.
  
  >>> v1 = Version("1.0a5")
  >>> v2 = Version("1.0")
  >>> v1
  <Version('1.0a5')>
  >>> v2
  <Version('1.0')>
  >>> v1 < v2
  True
  >>> v1 == v2
  False
  >>> v1 > v2
  False
  >>> v1 >= v2
  False
  >>> v1 <= v2
  True
docstr: A string representation of the version that can be rounded-tripped.
  
  >>> str(Version("1.0a5"))
  '1.0a5'
docstr_tok: ["A","string","representation","of","the","version","that","can","be","rounded-tripped",".",">",">",">","str","(","Version","(","``","1.0a5","''",")",")","'","1.0a5","'"]
code: def __str__(self) -> str:
      """A string representation of the version that can be rounded-tripped.
  
      >>> str(Version("1.0a5"))
      '1.0a5'
      """
      parts = []
  
      # Epoch
      if self.epoch != 0:
          parts.append(f"{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(f".post{self.post}")
  
      # Development release
      if self.dev is not None:
          parts.append(f".dev{self.dev}")
  
      # Local version segment
      if self.local is not None:
          parts.append(f"+{self.local}")
  
      return "".join(parts)
  
imports: import collections
  import itertools
  import re
  from typing import Any, Callable, Optional, SupportsInt, Tuple, Union
  from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType
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