将所有字段添加到pycharm中的类

时间:2019-11-01 15:39:41

标签: pycharm

我正在使用PyCharm。我开始定义一个类:

class A:
  def __init__(self,a,b,c):

我希望它看起来像这样:

class A:
  def __init__(self,a,b,c):
    self.a = a
    self.b = b
    self.c = c

使用alt输入,我可以让PyCharm从__init__中向类添加单个字段,但是随后我必须返回并针对每个变量单独进行一次操作,这最终变得很烦人。是否有任何捷径可以一次完成所有任务?

1 个答案:

答案 0 :(得分:0)

PyCharm 没有内置的 intention action 来自动声明和设置构造函数签名中的所有实例变量。

因此,实现此功能的 2 个主要替代方案是:

  1. 使用 External tool
  2. 使用 Live Template 变量和函数。
  3. (我猜是 a Plugin could be developed,但可能会涉及更多工作。)

使用外部工具有其自身的一系列问题,请参阅 PyCharm: Run black -S on region 的答案以了解其所涉及的内容。

对于这个问题中的问题,实时模板可能是最容易集成的。主要缺点是必须使用 Groovy Script(实时模板函数列表提供了使用 RegEx 的可能性 - 我认为前者是更好的方法。)

因此使用以下 Groovy 脚本 test.groovy

import java.util.regex.Pattern
import java.util.regex.Matcher

// the_func = "    fun_name(a, b, c)"  // For stand-alone testing.
the_func = _1  // PyCharm clipboard() function argument.

int count_indent = the_func.indexOf(the_func.trim());  // Count indentation whitspaces.

def arg_list_str

def pattern = "\\((.*?)\\)"
Matcher m = Pattern.compile(pattern).matcher(the_func);

while (m.find()) {
    arg_list_str = m.group(1)  // Retrieve parameters from inside parenthesis.
}

// println arg_list_str
String[] arguments = arg_list_str.split(",")  // Splits on parameter separator.

def result = ['\n']  // Ends the constructor line for convenience.

for(arg in arguments) {
    arg = arg.trim()  // Remove whitspaces surrounding parameter.
    if(arg == "self")  // Skips first method parameter 'self'.
        continue
    arg = " ".repeat(count_indent+4) + "self." + arg + " = " + arg + "\n" 
    result.add(arg)
}

String joinedValues = result.join("")

return joinedValues

并将实时模板设置为 File > Settings > Editor > Live Templates,如屏幕截图所示。将 clipboard() 函数与 Predefined functions 中的 groovyScript("c:\\dir_to_groovy\\test.groovy", clipboard()); 一起使用。 (虽然 Groovy 脚本 可以写在一行上,但在这种情况下,将其放在外部文件中会更容易)。

enter image description here

选择包含缩进的行,复制到剪贴板 (Ctrl + C),然后按 Ctrl + J

选择实时模板

enter image description here

生成实例变量的声明(按回车后缩进调整。)

enter image description here

尾注。

包含的 Groovy Script 中的签名解析器很简单,只关心解决问题中的问题。通过一些研究,可能可以使用完整的签名解析器来处理复杂的类型提示和默认参数。但就示例而言,它可以正常工作。