是我的类内装饰器不够 Pythonic 还是 PyCharm 在 lint 警告方面不够智能?

2023-12-25

我想在类中定义一个装饰器。我不想将它定义为一个单独的、独立的函数,因为这个装饰器是专门针对这个类的,我想将相关的方法保留在一起。

这个装饰器的目的是检查一些先决条件,特别是成员变量持有的数据库连接、SSH连接等是否仍然可用。如果不是,则不会调用装饰函数,并且将完成一些错误报告和清理工作。

我做了以下测试类来测试它是否有效,代码确实运行良好。但我发现PyCharm对这段代码显示了警告。所以我想知道,这是否意味着我的代码不是Pythonic,或者PyCharm不够智能而错误地给出了这个警告?

如果我的代码不是 Pythonic,如何更改? 如果这是 PyCharm 的错误,我和我的团队应如何配置 PyCharm 以让它专门忽略此类警告,同时保留大多数其他 lint 检查?

class TestClass:
    def __init__(self):
        self.flag = True

    def dec(func):
        def wrapper(self, *args, **kwargs):
            if not self.flag:
                print("Won't run!")
                return empty_fun(self, *args, **kwargs)
            return func(self, *args, **kwargs)

        def empty_fun(*args, **kwargs):
            return None

        return wrapper

    @dec
    def foo(self):
        print("foo")

    @dec
    def bar(self, msg, more, *args, **kwargs):
        print("message: %s" % msg)
        print("more %s:" % more)
        for item in args:
            print("other item: %s" % item)
        name = kwargs.get('name')
        age = kwargs.get('age')
        print('name: %s' % name)
        print('age: %s' % age)


def main():
    t = TestClass()
    t.foo()
    print('-'*10)
    t.bar("abc", 'def', 'hij', 'klm', name='Tom', age=20)


if __name__ == '__main__':
    main()

以下是 PyCharm 报告的 lint 警告:


您的代码在技术上是正确的(因为它将按预期工作),但需要注意的是dec将成为一种方法TestClass如果这样调用就会中断。你至少应该把它变成一个staticmethod以避免这种情况。

wrt/ pythonicity,当不需要这个装饰器时将其作为类的一部分确实是不Pythonic的。它仅适用于此类这一事实并不是使其成为该类的成员的理由,更不是使其成为公共 API 的一部分的理由。

您可能可以在注释中添加 linter 提示以使其静音,但我个人只是从类中提取此装饰器,将其设为私有,并记录它仅应与此类一起使用。

正如旁注:我假设你的empty_func是“错误报告和清理工作”的占位符 - 否则它毫无用处 - 但它真的需要在装饰器中定义吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是我的类内装饰器不够 Pythonic 还是 PyCharm 在 lint 警告方面不够智能? 的相关文章

随机推荐

  • 编写 Gradle 脚本来运行 Eclipse Android 测试项目的单元测试用例

    我有一个简单的 HelloWorld Android 项目 在 Eclipse IDE 中构建 我能够在该项目的 cmd 提示符中成功执行 gradle build 我还为其编写了一个简单的 JUnit Android 测试项目 并且它在
  • 如何将经度、纬度、高程转换为笛卡尔坐标?

    我下载了天气数据 它有经度 十进制 纬度 十进制 和海拔 米 值 没有有关所使用的坐标系的信息 我如何将其转换为笛卡尔坐标 我的尝试如下 但是 我的问题是找到正确的公式 def cartesian self longitude latitu
  • 如何使用 easywebdav 通过 python 连接到 owncloud?

    我正在尝试连接到owncloud与 python 的实例 我找到了easywebdav这应该可以很容易地通过 webdav 连接 但是当尝试连接时 我收到 404 Not Found import easywebdav webdav eas
  • 如何用CSS实现单行省略号

    我希望能够在响应式设计中添加三个点并将文本保留在一行中 例如 我有一个链接 其中包含容器元素内的链接 例如 span 如果文本很长 它将在小屏幕上分两行显示 This is a very long text and it wraps bec
  • 如何在 JSF 中将对象从一个页面传递到另一个页面而不编写转换器

    首先对我的英语感到抱歉 我在 JSF2 中有两个页面 一个用于列出乘客 另一个用于创建 更新乘客 我还有两个 ViewScoped bean 一个包含乘客列表 另一个用于在 pageB 中保留所选乘客 我看到了通过 viewParam 或
  • 如何在 ASP.NET/C# 中检查 URL 的顶级域?

    假设 www mysite fr home 是 URL 现在如何从中获取 fr 只是 fr 实际上我想做的是在检测到访问者的国家 地区后在运行时更改母版页 是的 我可以使用其他类中存在的countryCode变量 但也许我只能这样做 只是想
  • C#(锐利)从txt文件中读取随机行[重复]

    这个问题在这里已经有答案了 谁能告诉我如何从txt文件中读取随机行 我想从 txt 文件中读取随机行并在文本框中仅显示该行 代码示例会很棒 感谢转发 var lines File ReadAllLines path var r new Ra
  • jQuery UI - 加速自动完成

    我的自动完成功能运行良好 但我正在尝试找出使其更快的方法 这是我的 HTML Country
  • LyX 中的 Zed 表示法

    是否可以在 LyX 中创建 Zed 表示法方案 如何做呢 解决了 我通过 MikTeX 安装了 zed csp 样式包 然后 在 LyX 我去了Document gt Settings gt Latex Preamble并添加了 usepa
  • 如何捕获回滚异常

    对 catch 子句中已存在的 SqlTransaction RollBack 实现错误处理的最佳方法是什么 我的代码大致是这样的 using SqlConnection objSqlConn new SqlConnection connS
  • 如何在C#项目中实现和进行OCR?

    我已经搜索了一段时间 并且看到了一些 OCR 库请求 我想知道如何实现最纯粹 易于安装和使用的 OCR 库 并提供安装到 C 项目的详细信息 如果可能的话 我只想像通常的 dll 引用一样实现它 Example using org pdfb
  • 尝试将 yaml 数据转换为结构时输出为空[重复]

    这个问题在这里已经有答案了 我正在尝试将 yaml 数据转换为结构并打印它 我得到的这个程序的输出是空的 package main import fmt gopkg in yaml v2 type example struct variab
  • 当 size < 1 时,geom_sf 大小参数不起作用

    问题 我正在尝试使用 sf 包创建美国州 县的地图 并且geom sf 来自 ggplot2 但我无法得到size多边形边界线宽度的参数geom sf 正确创建细线时size lt 1 e g ggplot sf obj gt geom s
  • 将平面对象数组转换为嵌套对象

    我有以下数组 实际上来自后端服务 const flat Item id a name Root 1 parentId null id b name Root 2 parentId null id c name Root 3 parentId
  • C++ time_t 问题

    我在 C VS 2008 中的日期管理方面遇到问题 根据MSDN 规范 http msdn microsoft com en us library 323b6b3k 28v VS 90 29 aspx time t代表 自 1970 年 1
  • Erlang ping 节点问题

    我在 erlang shell 中做了 1 gt node nonode nohost But 2 gt net adm ping node pang 为什么 什么问题 为什么不打乒乓球 谢谢 你没有启动 Erlang name or sn
  • 使用 k 均值算法进行异常值检测

    我希望你能帮助我解决我的问题 我正在尝试使用 kmeans 算法来检测异常值 首先 我执行算法并选择那些距聚类中心距离较远的对象作为可能的异常值 我不想使用绝对距离 而是想使用相对距离 即对象到聚类中心的绝对距离与聚类中所有对象到其聚类中心
  • 如何检测 scanf() 末尾的空格或换行符?

    我正在编写一个程序 我必须接受来自用户的命令 就像用户可以在其中设置环境变量值的 shell 一样 我遇到的问题是如果用户输入set var var value我需要知道用户输入了一个空格而不仅仅是set并按下 Enter 键 这是一个不同
  • Beanshell 不允许我将 jar 添加到“默认”JRE 类加载器吗?

    我有一个问题豆壳 http www beanshell org manual bshmanual html我在任何地方都找不到答案 我只能通过以下两种方式之一运行 Beanshell 脚本 其中Classpath是在调用Beanshell之
  • 是我的类内装饰器不够 Pythonic 还是 PyCharm 在 lint 警告方面不够智能?

    我想在类中定义一个装饰器 我不想将它定义为一个单独的 独立的函数 因为这个装饰器是专门针对这个类的 我想将相关的方法保留在一起 这个装饰器的目的是检查一些先决条件 特别是成员变量持有的数据库连接 SSH连接等是否仍然可用 如果不是 则不会调