class_docstr: A pathlib-compatible interface for zip files.
  
  Consider a zip file with this structure::
  
      .
      ├── a.txt
      └── b
          ├── c.txt
          └── d
              └── e.txt
  
  >>> data = io.BytesIO()
  >>> zf = zipfile.ZipFile(data, 'w')
  >>> zf.writestr('a.txt', 'content of a')
  >>> zf.writestr('b/c.txt', 'content of c')
  >>> zf.writestr('b/d/e.txt', 'content of e')
  >>> zf.filename = 'mem/abcde.zip'
  
  Path accepts the zipfile object itself or a filename
  
  >>> root = Path(zf)
  
  From there, several path operations are available.
  
  Directory iteration (including the zip file itself):
  
  >>> a, b = root.iterdir()
  >>> a
  Path('mem/abcde.zip', 'a.txt')
  >>> b
  Path('mem/abcde.zip', 'b/')
  
  name property:
  
  >>> b.name
  'b'
  
  join with divide operator:
  
  >>> c = b / 'c.txt'
  >>> c
  Path('mem/abcde.zip', 'b/c.txt')
  >>> c.name
  'c.txt'
  
  Read text:
  
  >>> c.read_text()
  'content of c'
  
  existence:
  
  >>> c.exists()
  True
  >>> (b / 'missing.txt').exists()
  False
  
  Coercion to string:
  
  >>> import os
  >>> str(c).replace(os.sep, posixpath.sep)
  'mem/abcde.zip/b/c.txt'
  
  At the root, ``name``, ``filename``, and ``parent``
  resolve to the zipfile. Note these attributes are not
  valid and will raise a ``ValueError`` if the zipfile
  has no filename.
  
  >>> root.name
  'abcde.zip'
  >>> str(root.filename).replace(os.sep, posixpath.sep)
  'mem/abcde.zip'
  >>> str(root.parent)
  'mem'
docstr: Construct a Path from a ZipFile or filename.
  
  Note: When the source is an existing ZipFile object,
  its type (__class__) will be mutated to a
  specialized type. If the caller wishes to retain the
  original type, the caller should either create a
  separate ZipFile object or pass a filename.
docstr_tok: ["Construct","a","Path","from","a","ZipFile","or","filename",".","Note",":","When","the","source","is","an","existing","ZipFile","object",",","its","type","(","__class__",")","will","be","mutated","to","a","specialized","type",".","If","the","caller","wishes","to","retain","the","original","type",",","the","caller","should","either","create","a","separate","ZipFile","object","or","pass","a","filename","."]
code: def __init__(self, root, at=""):
      """
      Construct a Path from a ZipFile or filename.
  
      Note: When the source is an existing ZipFile object,
      its type (__class__) will be mutated to a
      specialized type. If the caller wishes to retain the
      original type, the caller should either create a
      separate ZipFile object or pass a filename.
      """
      self.root = FastLookup.make(root)
      self.at = at
  
imports: import io
  import posixpath
  import zipfile
  import itertools
  import contextlib
  import sys
  import pathlib
label_desc: Use image node_id 1 to create a new Path object  with example: obj = Path(root, at)