【问题标题】:PyCharm extract parameter usually doesn't work: "Cannot perform refactoring using selected element(s)"PyCharm 提取参数通常不起作用:“无法使用选定元素执行重构”
【发布时间】:2016-09-12 20:55:58
【问题描述】:
def my_method(self):
    print self.my_field * 2

我希望能够为此添加一个参数,以便在其他情况下我可以使用不同的表达式来代替self.my_field,也许是self.my_other_fieldself.my_field + 1。我选择 self.my_field 并执行 Refactor > Extract > Parameter。我收到一条错误消息,提示“无法使用选定元素执行重构”。

它应该可以重构,因为 my_method 的调用类似于self.my_method()other_obj.my_method()。它可以将这些更改为self.my_method(self.my_field)other_obj.my_method(other_obj.my_field)

一般来说,只有当表达式非常简单(例如常量)时,我才能使用提取参数功能。如果它是取决于现有参数值的表达式,则它不起作用。我猜self 是现有参数的一个特例。这只是提取参数的限制,还是我做错了?

【问题讨论】:

    标签: parameters refactoring pycharm


    【解决方案1】:

    看起来你实际上想要做的是refactor through renaming,而不是extracting a new parameter

    您会注意到参数提取的预期功能是修改现有调用以包含您的新参数。但是,根据您在问题中所说的:

    我选择 self.my_field

    看起来您要么不小心选择了方法中的语句,要么试图通过重构来修改表达式。 (或者,如果有其他内容,您能否说明您的预期结果?)在后一种情况下,这将更适合替代重构。

    一般来说,通过提取重构你的代码需要一段代码:

    def my_method(): return 1 + 2

    并将其内脏移到别处:

    def my_method(a=1,b=2): return a + b

    在您的 sn-p 中: def my_method(self): print(self.my_field * 2) 该方法的主体不包含在内,因此从语句中提取是没有意义的。相反,您似乎只想在my_method 的声明中将self.my_field 替换为self.my_other_field。同样,由于您的示例很简单,因此有些不清楚。

    【讨论】:

    • 我希望结果是方法被定义为def my_method(self, param): print param * 2 并且对self.my_method() 的调用被替换为self.my_method(self.my_field)
    • 好的,我明白了。我能够使用带有Change Signature 的重构工具来完成此任务,其中可以向预先存在的方法添加参数并重构预先存在的调用以包含它。
    • 是的,好的。这有点手动,因为您必须将要用于默认值的表达式复制到更改签名对话框中,然后将该表达式替换为新参数的名称。但是感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多