class_docstr: A string that represents a path relative to an artifact or run.
  
  The format of the string is always as a POSIX path, e.g. "foo/bar.txt".
  
  A neat trick is that you can use this class as if it were a PurePosixPath. E.g.:
  ```
  >>> path = LogicalPath("foo/bar.txt")
  >>> path.parts
  ('foo', 'bar.txt')
  >>> path.parent / "baz.txt"
  'foo/baz.txt'
  >>> type(path.relative_to("foo"))
  LogicalPath
  ```
docstr: Act like a subclass of PurePosixPath for all methods not defined on str.
docstr_tok: ["Act","like","a","subclass","of","PurePosixPath","for","all","methods","not","defined","on","str","."]
code: def __getattr__(self, attr: str) -> Any:
      """Act like a subclass of PurePosixPath for all methods not defined on str."""
      try:
          result = getattr(self.to_path(), attr)
      except AttributeError as e:
          raise AttributeError(
              f"LogicalPath has no attribute {attr!r}"
          ) from e
  
      if isinstance(result, PurePosixPath):
          return LogicalPath(result)
  
      # If the result is a callable (a method), wrap it so that it has the same
      # behavior: if the call result returns a PurePosixPath, return a LogicalPath.
      if callable(result):
  
          @wraps(result)
          def wrapper(*args: Any, **kwargs: Any) -> Any:
              inner_result = result(*args, **kwargs)
              if isinstance(inner_result, PurePosixPath):
                  return LogicalPath(inner_result)
              return inner_result
  
          return wrapper
      return result
  
file_path: wandb/wandb/sdk/lib/paths.py
imports: import os
  import platform
  from functools import wraps
  from pathlib import PurePath, PurePosixPath
  from typing import Any, NewType, Union
label_desc: Use image node_id 3 for calling the LogicalPath obj's underlying member method code with example usage: obj.__getattr__(attr) and returns: result, LogicalPath, wrapper, inner_result, LogicalPath