瀏覽代碼

feat: Lazy import functionality added (#12517)

version-14
Leela vadlamudi 4 年之前
committed by GitHub
父節點
當前提交
08e2ad9904
沒有發現已知的金鑰在資料庫的簽署中 GPG 金鑰 ID: 4AEE18F83AFDEB23
共有 2 個檔案被更改,包括 43 行新增6 行删除
  1. +9
    -6
      frappe/__init__.py
  2. +34
    -0
      frappe/utils/lazy_loader.py

+ 9
- 6
frappe/__init__.py 查看文件

@@ -18,9 +18,14 @@ import os, sys, importlib, inspect, json
from past.builtins import cmp
import click

# public
# Local application imports
from .exceptions import *
from .utils.jinja import (get_jenv, get_template, render_template, get_email_from_template, get_jloader)
from .utils.lazy_loader import lazy_import

# Lazy imports
faker = lazy_import('faker')


# Harmless for Python 3
# For Python 2 set default encoding to utf-8
@@ -1749,15 +1754,13 @@ def parse_json(val):
return parse_json(val)

def mock(type, size=1, locale='en'):
from faker import Faker

results = []
faker = Faker(locale)
if not type in dir(faker):
fake = faker.Faker(locale)
if type not in dir(fake):
raise ValueError('Not a valid mock type.')
else:
for i in range(size):
data = getattr(faker, type)()
data = getattr(fake, type)()
results.append(data)

from frappe.chat.util import squashify


+ 34
- 0
frappe/utils/lazy_loader.py 查看文件

@@ -0,0 +1,34 @@
import importlib.util
import sys

def lazy_import(name, package=None):
"""Import a module lazily.

The module is loaded when modules's attribute is accessed for the first time.
This works with both absolute and relative imports.
$ cat mod.py
print("Loading mod.py")
$ python -i lazy_loader.py
>>> mod = lazy_import("mod") # Module is not loaded
>>> mod.__str__() # module is loaded on accessing attribute
Loading mod.py
"<module 'mod' from '.../frappe/utils/mod.py'>"
>>>

Code based on https://github.com/python/cpython/blob/master/Doc/library/importlib.rst#implementing-lazy-imports.
"""
# Return if the module already loaded
if name in sys.modules:
return sys.modules[name]

# Find the spec if not loaded
spec = importlib.util.find_spec(name, package)
if not spec:
raise ImportError(f'Module {name} Not found.')

loader = importlib.util.LazyLoader(spec.loader)
spec.loader = loader
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
loader.exec_module(module)
return module

Loading…
取消
儲存