如何使PyCharm自动建议一个被元类修改的类的函数?

2admgd59  于 2023-02-08  发布在  PyCharm
关注(0)|答案(1)|浏览(147)

为了简化处理数据库表的代码,我编写了一个元类工厂,如下所示:

#metaClass factory
def base_service(clz_of_model):

  @db.transactional
  def add(self, obj):
    m = clz_of_model(**obj)
    db.session.add(m)
    return m

  class BaseService(type):
     def __new__(mcs, name, base, attrs):
        attrs["add"] = add
        return super().__new__(mcs, name, base, attrs)

  return BaseService

#define a model
class UserModel(Base):
   #....

#define a service
class UserService(object,metaclass=base_service(UserModel):
   #....

#using service
user_service=UserSerivce()
user_service.add({"name":'tom'})

该代码确实可以工作,但有一个不便之处:

当我在Pycharm中输入user_servce.时,IDE不会建议user_service具有由元类定义的add函数。

如何让PyCharm的建议起作用?我能有一个更好的解决方案来使用Python的元类吗?

sczxawaw

sczxawaw1#

你不能。
原因很简单,这不是静态可检测的-不是这个,也不是其他几十种向类添加动态方法和属性的方法。
如果pycharm依赖于静态分析Python代码来建议自动完成,那么它将永远无法超越最普通、最显式的代码。
类只有在新方法被创建为活动的Python对象之后才能看到它。
我认为有一些工具使用这种方法来代替(尽管在运行导入的模块时会触发副作用)-当然,如果您使用Jupyter笔记本编写代码,在类声明下面的单元格中,添加的方法将是可见的。
我知道最近有一种趋势是IDE与嵌入式笔记本一起工作,而不仅仅是编辑文件--也许有一种工作流允许您使用"活的"对象进行开发,并在完成后将所有单元格内容保存到一个. py文件中。
或者,如果您的类在一个单独的Python项目中,而不是在您正在编辑的项目中,pycharm本身将导入模块,并能够内省活动的类。
但最重要的是,有一个事实仍然存在:一个人不应该依赖IDE和其他工具 * 辅助 * 来编写他们需要的代码。如果辅助工具可用并且有效,那么一切都很好,否则,就编写代码。
很抱歉这听起来很生硬,但是如果没有动态修改代码的实际运行,您想要的东西是不可能实现的。
如果pycharm甚至不能为其他项目中的文件做这个,而你想让动态方法在你的项目的第三方用户编辑这个文件时显示出来,解决方法是让你的元类生成带有添加的方法的Python文件--并且把那些修改过的部分作为你的项目实际使用的部分。类放在一个目录中,然后在项目安装时呈现到另一个目录中的"完整"类。这样,即使只依赖于静态代码分析的工具也可以找到它。但我认为,如果动态代码不在当前编辑的文件/项目中,pycharm和其他工具可以进行实时内省。

相关问题