Python 从装饰器导入模块

2024-03-12

我正在使用 Python 3 开发一个应用程序,而且我所做的事情是非常规的。

cx_Oracle 是一个很难设置的模块,对于我的应用程序来说是一个可选的依赖项。我想做的是将模块的导入包装在装饰器中,仅放置在使用它的函数之上。这将避免必须在我的模块顶部导入并允许它不被设置。

class Loader():
    def load_cx_oracle(func):
        def inner(*args, **kwargs):

            # Additional code before import.

            import cx_Oracle

            return func(*args, **kwargs)
        return inner

    @load_cx_oracle
    def function_using_cx_oracle(self):
        conn = cx_Oracle.connect()

但是,当我尝试上述操作时,我得到NameError: name 'cx_Oracle' is not defined


已接受的答案存在一些问题。其中最重要的是,每次调用函数时它都会运行导入逻辑。第二个是装饰器必须定义在使用它的同一模块中,否则装饰器和被装饰器将具有不同的全局变量。您可以通过以下方式直接访问函数的全局变量__globals__函数的属性。在执行导入逻辑之前,代码示例首先检查函数的全局变量中是否存在模块。该示例还使用了functools.wraps装饰器在使用诸如以下内容时保留文档字符串、函数名称以及参数名称help(func).

from functools import wraps

def load_operator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if "operator" not in func.__globals__:
            # setup logic -- only executed once
            import operator
            func.__globals__["operator"] = operator
        return func(*args, **kwargs)
    return wrapper

class A:
    @load_operator
    def add(self, x, y):
        return operator.add(x, y)

    def subtract(self, x, y):
        return operator.subtract(x, y)

a = A()
try:
    a.subtract(1, 2)
except NameError:
    print("operator not yet loaded")
print(a.add(1, 2))
print(A.add)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 从装饰器导入模块 的相关文章

随机推荐

  • 如何从音频文件中分离男声和女声(C++或Java)

    我想区分音频文件中的男声和女声并将它们分开 作为输出 我希望将两个声音分开 你能帮我一下吗 编码可以用java还是c 完成 这可能是一个非常复杂的问题 它类似于编写自己的语音识别 或识别 算法 您首先可以将音频转换为频域 这是使用快速傅立叶
  • HTML(5)/CSS 中的列布局

    HTML5 CSS 中是否有一种方法可以将列布局如下所示 并且仍然可以正确地显示文本 C1 C2 C3 C4 C5 C6 只是为了澄清 我希望能够在单个元素中编写所有文本并让 CSS 创建列 虽然这使用单个元素 但必须手动定义中断 Use
  • 无法将 SQL 查询转换为左外连接的 LINQ 查询

    问题陈述 我正在尝试将我的 Sql 之一转换为 linq 查询 但我无法获得所需的输出 谁能建议我应该做什么 SQL查询 SELECT AssetTagging AssetID AssetTagging AssetDescription R
  • 离子滚动到特定列表项

    有没有办法滚动到离子列表中的特定项目 例如在此代码笔中 https codepen io anon pen grEBQJ https codepen io anon pen grEBQJ 当我转到测试按钮时 我想滚动到带有文本 文本 的列表
  • GBM 上的 EGLDisplay

    我想通过 EGL 创建 OpenGL 上下文 由于我实际上不会绘图 所以我想将 Pbuffers 与 GBM 平台结合使用 这是代码 C99 include
  • 有没有办法在 pysvg 中添加换行符?

    考虑以下最小工作示例 from pysvg text import from pysvg builders import doc svg doc addElement text hello nWorld 150 50 doc save He
  • 是否有 WebMethod 的替代方案来绕过回发但访问会话

    因此 我正在尝试提高 ASP Net Webforms 应用程序的性能 像往常一样 回发会尽力降低性能 我开始了解 WebMethod 调用 我也设法开始工作 然而 对于我的特定场景 我需要访问会话 这在静态方法中显然是不可能的 所以现在我
  • Swift 3 - 如何将包含结构的结构数组转换为 JSON?

    我有一个数组Field我想要转换为 JSON 字符串的结构 Field定义为 struct Field var name String var center LatLng var perimeter LatLng func toDictio
  • 为什么 Azure 通知中心标签不保存?

    我正在尝试向通知中心发送消息 但我的标签未保存 I checked service hub with service hub explorer and tags are empty 设备注册 var hs new HashSet
  • MapReduce - 如何按值对减少输出进行排序

    如何按值降序对减速器输出进行排序 我正在开发一个必须返回最常听的歌曲的应用程序 因此 歌曲必须按照收听次数排序 我的应用程序以这种方式工作 Input songname userid boolean MapOutput songname u
  • 发现插件与新版本不兼容:Firebase Services

    我无法更新到 Android Studio 4 0 当我检查更新时 它向我显示以下消息 发现与新版本不兼容的插件 Firebase Services 这是 Android Studio 插件的 Firebase 服务 https plugi
  • Log4j2 RegexFilter 模式不匹配

    我的日志中有以下几行我想排除 所以我想使用RegexFilter这样做 INFO 2018 05 20 14 52 15 993 qtp22844606 20 TimingFilter Request time 16 ms INFO 201
  • ContinueWith TaskContinuationOptions.OnlyOnFaulted 似乎没有捕获从已启动任务引发的异常

    我正在尝试使用 ContinueWith 和 OnlyOnFaulted 捕获从任务方法引发的异常 如下所示 但是 当我尝试运行此代码时 出现未处理的异常 我希望任务能够完成 因为我已经处理了异常 但是 Task Wait 遇到 Aggre
  • Angular4 项目上字体很棒的图标未加载

    我正在使用 font awesome 开发 Angular 4 项目 我按照本指南使用 npm 安装库 如何将 font awesome 添加到 Angular 2 CLI 项目 https stackoverflow com questi
  • 根据多个任意模式验证 XML

    考虑一个具有多个模式的 XML 文档 其开头如下所示 这不是 Spring 特定的问题 这只是示例的一个方便的 XML 文档
  • 为什么 GetAttr 不适用于 cloudformation 模板参数?

    拥有父子关系中的 cloudformation 模板集合 并希望将 AWS IAM Role 传递到子堆栈的参数中 并使用 GetAttr 获取 Arn 这会导致验证失败 因为只能对资源调用 GetAttr 而不能对参数调用 有人知道 猜猜
  • 当服务器在Linux中启动时,Spring Boot出现错误

    首先 有两个Linux服务器 我想建立一个冗余的web server在两台服务器上 我在两台服务器上均等地安装了jre1 8 0 并且我在两台服务器上均等地安装了相同的spring boot war文件 顺便一提 服务器1正常启动并正常工作
  • 如何在 ruby​​ on Rails 中调用存储过程?

    我是 ROR 新手 我想在单击 VIEW 中的提交按钮时调用存储过程进行处理 Model class Pro DataImport lt ActiveRecord Base attr accessible file name process
  • NamedPipe 多个服务器

    对于简单的 IPC 我选择了 NamedPipes 在进程 本地 之间进行通信 由于需求的变化 应该有多个服务器实例 这会导致同一管道名上有多个 侦听器 但似乎有一个问题 这些侦听器中只有一个会收到消息 其他所有实例都不会收到消息 有某种
  • Python 从装饰器导入模块

    我正在使用 Python 3 开发一个应用程序 而且我所做的事情是非常规的 cx Oracle 是一个很难设置的模块 对于我的应用程序来说是一个可选的依赖项 我想做的是将模块的导入包装在装饰器中 仅放置在使用它的函数之上 这将避免必须在我的