如何解决如何在Pycharm中提取参数而不强制使用默认值?
使用PyCharm提取函数中的参数时,似乎唯一的选择是将所选对象添加为新参数的默认值。有时最好用选定的对象替换该函数的所有用法,例如在IntelliJ中,它是与Pycharm来自同一创建者的Java IDE。
我知道Java不允许使用默认值,但是Python具有功能并不意味着它始终是最佳选择。使用Pycharm提取(或引入)参数时,可以选择以下选项之一:
- 通过添加新参数来更改函数的签名,并将所选对象添加为其默认值(实际行为)
- 通过添加新参数来更改函数的签名,并更改其所有用法以使用选定的参数来调用函数(行为不可用)
是否可以像选项2一样提取参数?
例如,在测试类中,我可以使用下面的函数实例化目标类的对象
from unittest import TestCase
EMAIL ="a@b.com"
# Placeholder for object creation (a class' constructor,for example)
create_object = lambda email: "an object"
class Test(TestCase):
def test_1(self):
test_object = self.get_test_object()
# ...
def test_2(self):
test_object = self.get_test_object()
# ...
def test_3(self):
test_object = self.get_test_object()
# ...
def get_test_object(self):
# Use the EMAIL constant to create a test_object
test_object = create_object(EMAIL)
return test_object
现在想象一下,我想将电子邮件作为参数添加到函数“ get_test_object”中,而不是使用全局变量“ EMAIL”。在Pycharm中,右键单击EMAIL-> Refactor-> Introduce Parameter,然后输入参数名称。这不会改变用法,只会设置一个具有默认值的新参数,如下所示:
def get_test_object(self,email=EMAIL):
# Use the EMAIL constant to create a test_object
test_object = create_object(email)
return test_object
如果我想与其他电子邮件一起使用该功能,可以通过调用“ get_test_object('c@d.com')”来实现,但是该功能的其他用法将迫使读者隐式检查该电子邮件是什么使用。在这种情况下,我认为最好更改所有用法而不是添加默认值,因此在添加该函数的新用法时会这样:
from unittest import TestCase
EMAIL ="a@b.com"
# Placeholder for object creation (a class' constructor,for example)
create_object = lambda email: "an object"
class Test(TestCase):
def test_1(self):
test_object = self.get_test_object(EMAIL)
# ...
def test_2(self):
test_object = self.get_test_object(EMAIL)
# ...
def test_3(self):
test_object = self.get_test_object(EMAIL)
# ...
def test_4(self):
test_object = self.get_test_object("c@d.com")
# ...
def get_test_object(self,email):
test_object = create_object(email)
return test_object
解决方法
我发现做到这一点的唯一方法是分两个步骤:
- 如上图所示,右键单击EMAIL-> Refactor-> Introduce Parameter并输入参数名称
- 右键单击函数的“电子邮件”参数(不是值)->重构->更改签名->取消选中“在签名中使用默认值”
依次执行1和2将提取一个参数,并更改所有功能用法,以将其包含在调用中,如最初所希望的那样。然而,这太麻烦了。最好只一步就完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。