guidellm.utils.lazy_loader
lazy_loader
Makes it easy to load subpackages and functions on demand.
File uses code adapted from code with the following license:
BSD 3-Clause License
Copyright © 2022--2023, Scientific Python project All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ExtraAttr
Bases: NamedTuple
Descriptor for a lazily imported attribute in :func:attach_extras.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source | Dotted module path to import from. | required | |
alias | Attribute name inside source. When | required |
Source code in src/guidellm/utils/lazy_loader.py
attach(package_name, submodules=None, submod_attrs=None, lazy_submodules=False)
Attach lazily loaded submodules, functions, or other attributes.
Typically, modules import submodules and attributes as follows::
import mysubmodule import anothersubmodule
from .foo import someattr
The idea is to replace a package's __getattr__, __dir__, and __all__, such that all imports work exactly the way they would with normal imports, except that the import occurs upon first use.
The typical way to call this function, replacing the above imports, is::
getattr, dir, all = lazy.attach( name, ["mysubmodule", "anothersubmodule"], {"foo": ["someattr"]} )
Parameters
package_name : str Typically use __name__. submodules : set List of submodules to attach. submod_attrs : dict Dictionary of submodule -> list of attributes / functions. These attributes are imported as they are used. lazy_submodules : bool Whether to lazily load submodules. If set to True, submodules are returned as lazy proxies. Note that attribute access from submod_attrs will trigger the import of the submodule.
Returns
getattr, dir, all
Source code in src/guidellm/utils/lazy_loader.py
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | |
attach_extras(module_name, *, attrs=None, package=None, error_message='Required optional dependency is not installed')
Attach lazily loaded attributes from optional external packages.
Designed for 'extras' modules that re-export symbols from optional dependencies. The resulting module is always safe to import; errors are deferred until an attribute is actually accessed.
Exactly one of attrs or package must be provided.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
module_name | Typically use | required | |
attrs | Map of exported names to :class: | None | |
package | Name of a package whose public attributes should be proxied wholesale. | None | |
error_message | Human-readable message included in the | 'Required optional dependency is not installed' |
Returns:
| Type | Description |
|---|---|
|
|
Source code in src/guidellm/utils/lazy_loader.py
attach_stub(package_name, filename)
Attach lazily loaded submodules, functions from a type stub.
This is a variant on attach that will parse a .pyi stub file to infer submodules and submod_attrs. This allows static type checkers to find imports, while still providing lazy loading at runtime.
Parameters
package_name : str Typically use __name__. filename : str Path to .py file which has an adjacent .pyi file. Typically use __file__.
Returns
getattr, dir, all The same output as attach.
Raises
ValueError If a stub file is not found for filename, or if the stubfile is formmated incorrectly (e.g. if it contains an relative import from outside of the module)
Source code in src/guidellm/utils/lazy_loader.py
load(fullname, *, require=None, error_on_import=False, suppress_warning=False)
Return a lazily imported proxy for a module.
We often see the following pattern::
def myfunc(): import numpy as np np.norm(...) ....
Putting the import inside the function prevents, in this case, numpy, from being imported at function definition time. That saves time if myfunc ends up not being called.
This load function returns a proxy module that, upon access, imports the actual module. So the idiom equivalent to the above example is::
np = lazy.load("numpy")
def myfunc(): np.norm(...) ....
The initial import time is fast because the actual import is delayed until the first attribute is requested. The overall import time may decrease as well for users that don't make use of large portions of your library.
Warning
While lazily loading subpackages technically works, it causes the package (that contains the subpackage) to be eagerly loaded even if the package is already lazily loaded. So, you probably shouldn't use subpackages with this load feature. Instead you should encourage the package maintainers to use the lazy_loader.attach to make their subpackages load lazily.
Parameters
fullname : str The full name of the module or submodule to import. For example::
sp = lazy.load("scipy") # import scipy as sp
require : str A dependency requirement as defined in PEP-508. For example::
"numpy >=1.24"
If defined, the proxy module will raise an error if the installed
version does not satisfy the requirement.
error_on_import : bool Whether to postpone raising import errors until the module is accessed. If set to True, import errors are raised as soon as load is called.
suppress_warning : bool Whether to prevent emitting a warning when loading subpackages. If set to True, no warning will occur.
Returns
pm : importlib.util._LazyModule Proxy module. Can be used like any regularly imported module. Actual loading of the module occurs upon first attribute request.
Source code in src/guidellm/utils/lazy_loader.py
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 | |