【问题标题】:How to document dynamic methods for the purpose of autocomplete如何记录动态方法以实现自动完成
【发布时间】:2021-12-18 11:12:12
【问题描述】:

我有一个使用 transition library 的 Python 3.9 类。这个库从本地类设置中创建动态方法,例如:

class experiment:
    # The states
    states=['solid', 'liquid', 'gas', 'plasma']
    
    # each trigger will create a dynamic method.
    transitions = [
        { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' },
        { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' },
        { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' },
        { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' }
    ]

    def __init__(self):
        self.machine = LHGMachine(model=self, states=self.states, transitions=self.transitions, initial=self.states[0])

在本例中,将创建动态方法。喜欢:self.melt()self.evaporate()self.transitions 中所述的其他内容。

是否可以将它们记录下来,以便 IDE 提示哪些方法可用?

【问题讨论】:

  • 您必须为 PyCharm 实现类型提示才能在自动完成中显示这些方法。我看不到转换库的哪一部分实现了魔术方法(并且您的代码缺少导入,因此它不是 MRE)。但是,我认为转换库不会自动生成一个带有魔术函数签名所需类型提示的存根文件(如果它都是动态的,PyCharm linter 可能会或可能无法解决它以显示自动完成 - 我猜是不会解决这种情况)。如果您只想提示收藏,请参阅this thread
  • @bad_coder,也许我称它为magic 是错误的,但方法self.melt() 是从上述字典中填充的。这是我希望 IDE 自动完成的方法。和evapor() 等一样
  • 我在做一个有根据的猜测(超出我之前的评论),如果你想要自动完成工作,你应该使用the Enumerations。是的"magic methods" 是笨蛋。
  • 将通过将magic 替换为dynamic 来修复标题。
  • 您熟悉__doc__ 属性吗?

标签: python python-3.x autocomplete pycharm


【解决方案1】:

到目前为止,我发现的最好和最具声明性的解决方案是将动态方法声明为带有 Callable 类型提示的类属性。

使用上面的例子应该是这样的:

from typing import Callable

class experiment:
    # The states
    states=['solid', 'liquid', 'gas', 'plasma']
    
    # each trigger will create a dynamic method.
    transitions = [
        { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' },
        { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' },
        { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' },
        { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' }
    ]

    # here are the declerations for the puprose of readability/autocomplete
    melt: Callable
    evaporate: Callable
    sublimate: Callable
    ionize: Callable

    def __init__(self):
        self.machine = LHGMachine(model=self, states=self.states, transitions=self.transitions, initial=self.states[0])

现在调用obj->melt()obj->evaporate 等时,自动完成功能将按预期工作。

【讨论】:

    【解决方案2】:

    为了解决这个问题,我创建了一个 .pyi 文件,其内容如下:

    class Experiment:
        def melt(self): pass
        def evaporate(self): pass
        def sublimate(self): pass
        def ionize(self): pass
    

    它似乎是 PEP 484 的一部分,并在多个 IDE 上受支持。我在 PyCharm 上测试过。

    这是来自 JetBrains 讨论线程的另一个 example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2016-06-23
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      相关资源
      最近更新 更多