我正在使用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__
中向类添加单个字段,但是随后我必须返回并针对每个变量单独进行一次操作,这最终变得很烦人。是否有任何捷径可以一次完成所有任务?
答案 0 :(得分:0)
PyCharm 没有内置的 intention action 来自动声明和设置构造函数签名中的所有实例变量。
因此,实现此功能的 2 个主要替代方案是:
使用外部工具有其自身的一系列问题,请参阅 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 脚本 可以写在一行上,但在这种情况下,将其放在外部文件中会更容易)。
选择包含缩进的行,复制到剪贴板 (Ctrl + C),然后按 Ctrl + J
选择实时模板生成实例变量的声明(按回车后缩进调整。)
尾注。
包含的 Groovy Script 中的签名解析器很简单,只关心解决问题中的问题。通过一些研究,可能可以使用完整的签名解析器来处理复杂的类型提示和默认参数。但就示例而言,它可以正常工作。