mirror of
https://github.com/hwchase17/langchain.git
synced 2025-04-28 03:51:50 +00:00
TL;DR: you can't optimize imports with a lazy `__getattr__` if there is a namespace conflict with a module name and an attribute name. We should avoid introducing conflicts like this in the future. This PR fixes a bug introduced by my lazy imports PR: https://github.com/langchain-ai/langchain/pull/30769. In `langchain_core`, we have utilities for loading and dumping data. Unfortunately, one of those utilities is a `load` function, located in `langchain_core/load/load.py`. To make this function more visible, we make it accessible at the top level `langchain_core.load` module via importing the function in `langchain_core/load/__init__.py`. So, either of these imports should work: ```py from langchain_core.load import load from langchain_core.load.load import load ``` As you can tell, this is already a bit confusing. You'd think that the first import would produce the module `load`, but because of the `__init__.py` shortcut, both produce the function `load`. <details> More on why the lazy imports PR broke this support... All was well, except when the absolute import was run first, see the last snippet: ``` >>> from langchain_core.load import load >>> load <function load at 0x101c320c0> ``` ``` >>> from langchain_core.load.load import load >>> load <function load at 0x1069360c0> ``` ``` >>> from langchain_core.load import load >>> load <function load at 0x10692e0c0> >>> from langchain_core.load.load import load >>> load <function load at 0x10692e0c0> ``` ``` >>> from langchain_core.load.load import load >>> load <function load at 0x101e2e0c0> >>> from langchain_core.load import load >>> load <module 'langchain_core.load.load' from '/Users/sydney_runkle/oss/langchain/libs/core/langchain_core/load/load.py'> ``` In this case, the function `load` wasn't stored in the globals cache for the `langchain_core.load` module (by the lazy import logic), so Python defers to a module import. </details> New `langchain` tongue twister 😜: we've created a problem for ourselves because you have to load the load function from the load file in the load module 😨. |
||
---|---|---|
.. | ||
cli | ||
community | ||
core | ||
experimental | ||
langchain | ||
partners | ||
standard-tests | ||
text-splitters | ||
packages.yml |