Source code for pysd.builders.python.imports
from typing import Union
[docs]
class ImportsManager():
"""
Class to save the imported modules information for intelligent import
"""
_external_libs = {"numpy": "np", "xarray": "xr"}
_external_submodules = ["scipy"]
_internal_libs = [
"functions", "statefuls", "external", "data", "lookups", "utils",
"allocation", "model"
]
def __init__(self):
self._numpy, self._xarray = False, False
self._functions, self._statefuls, self._external, self._data,\
self._lookups, self._utils, self._scipy, self._allocation,\
self._model =\
set(), set(), set(), set(), set(), set(), set(), set(), set()
[docs]
def add(self, module: str, function: Union[str, None] = None) -> None:
"""
Add a function from module.
Parameters
----------
module: str
module name.
function: str or None
function name. If None module will be set to true.
"""
if function:
getattr(self, f"_{module}").add(function)
else:
setattr(self, f"_{module}", True)
[docs]
def get_header(self, outfile: str) -> str:
"""
Returns the importing information to print in the model file
Parameters
----------
outfile: str
Name of the outfile to print in the header.
Returns
-------
text: str
Header of the translated model file.
"""
text =\
f'"""\nPython model \'{outfile}\'\nTranslated using PySD\n"""\n\n'
text += "from pathlib import Path\n"
for module, shortname in self._external_libs.items():
if getattr(self, f"_{module}"):
text += f"import {module} as {shortname}\n"
for module in self._external_submodules:
if getattr(self, f"_{module}"):
text += "from %(module)s import %(submodules)s\n" % {
"module": module,
"submodules": ", ".join(getattr(self, f"_{module}"))}
text += "\n"
for module in self._internal_libs:
if getattr(self, f"_{module}"):
text += "from pysd.py_backend.%(module)s import %(methods)s\n"\
% {
"module": module,
"methods": ", ".join(getattr(self, f"_{module}"))}
text += "from pysd import Component\n"
return text