Skip to main content

objectref

objectref is a library to parse object references and find referenced objects.

Notations

Object references are notations to locate modules or objects from the top level of a module.

package.module
package.module:object.attr

The first form simply refers a module, while the second form an object in module. It is also described in here.

This library also supports relative object references (prefixed with dots).

Usage

  • find(ref: str, package: str | None = None) -> Any

    The find function takes an object reference or parse() result, and returns the object pointed by the reference.

    The package argument must be set when the reference is relative.

    If qualified name is unspecified (the first form), the result is a module (types.ModuleType instance).

    ModuleNotFoundError is raised if the module cannot be found nor imported; LookupError if the object is not accessible from the top level of the module.

  • parse(ref: str) -> tuple[str, str | None]

    The parse function takes an object reference, and results in a tuple of module name and qualified name. The qualified name would be None in first form.

    ValueError is raised if the reference is invalid.

Example

import os.path

import objectref

print(objectref.find("os.path") == os.path)  # True
print(objectref.find("os.path:join") == os.path.join)  # True
print(objectref.parse("os.path"))  # ("os.path", None)
print(objectref.parse("os.path:join"))  # ("os.path", "join")

Entrypoint example

There are two main ways to execute a Python program.

  • Run python -m myapp.main in shells, which executes the module as __main__ under the hood. This relates to the first form of notation.

  • Run myapp installed by pip. It is generated according to entrypoint defined in the project metadata (e.g. myapp = myapp.main:main). This requires the second form notation with callable objects.

Here is a code snippet to unify these two ways and start a program by its object reference.

import objectref


def run(ref: str, package: str | None = None):
    modname, qualname = objectref.parse(ref)

    if qualname is None:
        # Use runpy to run a module with __name__ = "__main__"
        if modname.startswith("."):
            # runpy does not support relative module name.
            from importlib.util import resolve_name
            modname = resolve_name(modname, package)
        import runpy
        return runpy.run_module(modname, run_name="__main__")

    fn = objectref.find((modname, qualname), package)
    return fn()


if __name__ == "__main__":
    run("this")  # run the "this" module dynamically.

Release files for objectref 2023.10.31

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for objectref 2023.10.31
File Size Uploaded
objectref-2023.10.31.tar.gz 7.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for objectref 2023.10.31
File Interpreter ABI Platform
objectref-2023.10.31-py3-none-any.whl Python 3 none any Details

Total release size: 11.7 kB

Release files / objectref-2023.10.31.tar.gz

Download URL objectref-2023.10.31.tar.gz
Size 7.3 kB
Tags Source
SHA-256 checksum
How to use checksums
9fdd7487ab58c98160ad25978f41d2bec9acbc8bd7c39871e0c01785661401f5
BLAKE2b-256 checksum
How to use checksums
44cfe30f6dce72122cb00e9d20ece2b798f42a98aa56b516050bd2957ae02cff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/4.0.2 CPython/3.11.6

Release files / objectref-2023.10.31-py3-none-any.whl

Download URL objectref-2023.10.31-py3-none-any.whl
Size 4.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
03c1df453a4cf349c3ac4862f4ec65788efecd0814ac20c65f11dde361595aa8
BLAKE2b-256 checksum
How to use checksums
aaef005617e34ec167d841a838c0b5b047c19ab56f843522fa83ae606ff6af5b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/4.0.2 CPython/3.11.6

Release history Release notifications | RSS feed

This release

2023.10.31 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page