【问题标题】:Python wrap component constructor with method and keep argument completionPython用方法包装组件构造函数并保持参数完成
【发布时间】:2017-08-01 23:47:58
【问题描述】:

假设我有一个组件对象,例如路线。

class Route:
    def __init__(self, url='localhost', port=80)
        ...

我想提供一个路由管理器类,类似于 Flask 对@app.route 所做的,所以我可以创建和跟踪路由:

class Router:
    def route(self, *args, **kwargs):
        route = Route(*args, **kwargs)
        self.routes.append(route)

是否有一种简单的方法可以使 Router.route 方法具有自动反映 Route.__init__ 的参数完成和/或文档?

我尝试使用functools.wraps,但没有立即生效。是不是我用错了?

class Router:
    @wraps(Route.__init__)
    def route(self, *args, **kwargs):
        route = Route(*args, **kwargs)
        self.routes.append(route)

编辑:我正在使用带有最新 PyCharm (2016.3.2) 的 Python 3.6。

【问题讨论】:

  • 您希望在什么 IDE 中完成您的工作?你使用的是什么 Python 版本?旧 API 直接查看代码对象;没有办法欺骗他们。较新的代码使用高级协议。
  • 我希望有一个万能的解决方案,但我用我的设置更新了这个问题。有具体解决方案总比没有解决方案好。

标签: python pycharm python-decorators


【解决方案1】:

如果你这样做

import inspect
print(inspect.signature(Route.route))
print(help(Route.route))

您会看到functools.wraps 确实有效。但是,PyCharm 似乎不知道 functools.wraps 的含义。我建议将此作为错误报告给JetBrains

【讨论】:

  • 你转载了吗?我想在报告之前确认一下。
  • 是的,我做到了。 PyCharm 无法以这种方式识别 functools.wraps。
  • 现在有一个 PyCharm 错误 PY-23067 请求此功能。 @VillasV - 如果您想要该功能,请投票。
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多