astro py:docs

- Index
- Modules

### Navigation

- Astropy v5.2.1 »
- Module code »

# Source code for astropy.units.format

    # Licensed under a 3-clause BSD style license - see LICENSE.rst

    """
    A collection of different unit formats.
    """

    # This is pretty atrocious, but it will prevent a circular import for those
    # formatters that need access to the units.core module An entry for it should
    # exist in sys.modules since astropy.units.core imports this module
    import sys

    core = sys.modules["astropy.units.core"]

    from .base import Base
    from .cds import CDS
    from .console import Console
    from .fits import Fits
    from .generic import Generic, Unscaled
    from .latex import Latex, LatexInline
    from .ogip import OGIP
    from .unicode_format import Unicode
    from .vounit import VOUnit

    __all__ = [
        "Base",
        "Generic",
        "CDS",
        "Console",
        "Fits",
        "Latex",
        "LatexInline",
        "OGIP",
        "Unicode",
        "Unscaled",
        "VOUnit",
        "get_format",
    ]

    def _known_formats():
        inout = [
            name
            for name, cls in Base.registry.items()
            if cls.parse.__func__ is not Base.parse.__func__
        ]
        out_only = [
            name
            for name, cls in Base.registry.items()
            if cls.parse.__func__ is Base.parse.__func__
        ]
        return (
            f"Valid formatter names are: {inout} for input and output, "
            f"and {out_only} for output only."
        )

    def get_format(format=None):
        """
        Get a formatter by name.

        Parameters
        ----------
        format : str or `astropy.units.format.Base` instance or subclass
            The name of the format, or the format instance or subclass
            itself.

        Returns
        -------
        format : `astropy.units.format.Base` instance
            The requested formatter.
        """
        if format is None:
            return Generic

        if isinstance(format, type) and issubclass(format, Base):
            return format
        elif not (isinstance(format, str) or format is None):
            raise TypeError(
                f"Formatter must a subclass or instance of a subclass of {Base!r} "
                f"or a string giving the name of the formatter. {_known_formats()}."
            )

        format_lower = format.lower()

        if format_lower in Base.registry:
            return Base.registry[format_lower]

        raise ValueError(f"Unknown format {format!r}.  {_known_formats()}")