Pylint w0212-进行单元测试时发出警告
Pylint w0212-Warning while doing unittests
我们经常在 classes 的内部方法中使用这个双下划线前缀。这通常会在单元测试期间引发 W0212,因为我们直接调用受保护的方法,例如TestClass().__my_private_method()
.
我知道 Python 中没有私有方法。尽管如此,我发现这种使用下划线前缀的做法出于结构原因是好的,例如,它让其他开发人员很清楚如何使用 class.
现在我从 phoenix-github-page 中找到了针对 W0212 警告的修复:
class Foo:
def __bar(self):
pass
def baz(self):
return self.__bar()
foo = Foo()
foo.baz()
基于此,您可以创建单元测试方法,而无需像这样禁用 W0212:
class SomeClass:
""" some docstring
"""
def __init__(self) -> None:
self.myattr = 1
def __my_protected_method(self):
return self.myattr + 1
def __another_protected_method(self):
return self.myattr + 2
def method_for_unittests(self, method_name):
if method_name == "my_protected_method":
return self.__my_protected_method()
if method_name == "another_protected_method":
return self.__another_protected_method()
return None
这似乎是比使用单独的 .pylintrc
(建议 here)更好的解决方案。这就引出了以下问题:
- 我的解决方案是否有意义,还是我们应该坚持使用
#pylint: disable=protected-access
?
- 或者您是否有使用特殊装饰器的更好解决方案?我看到了一些东西here,这让我很好奇。我没有编写装饰器的经验,所以比较幼稚。
使用 pylint 始终可以禁用该消息,或使用 hack 使其消失。但最好是简单地禁用消息而不是破解一些可以使 pylint 停止抱怨(但不会使代码更好)的东西。最好的办法是了解根本问题以解决它。
如果您正在创建一个仅用于测试的函数(仅测试 API),那么您就是在进行黑客攻击,让 pylint 认为您正在使用 public API。您应该做的是通过函数的 public 接口(通过到处使用的真实 API 测试 private/protected 方法,正如@jonrscharpe 在评论中指出的那样。
如果您不能这样做,则意味着私有 class 隐藏在您的代码中等待创建。
通告:我们正在尝试将您在问题中链接到 pylint 的 valid-phoenix 的文档工作包括在内并进行改进。您可以帮助 pylint 团队提出更好的修复建议,请参阅 https://github.com/PyCQA/pylint/issues/5953
我们经常在 classes 的内部方法中使用这个双下划线前缀。这通常会在单元测试期间引发 W0212,因为我们直接调用受保护的方法,例如TestClass().__my_private_method()
.
我知道 Python 中没有私有方法。尽管如此,我发现这种使用下划线前缀的做法出于结构原因是好的,例如,它让其他开发人员很清楚如何使用 class.
现在我从 phoenix-github-page 中找到了针对 W0212 警告的修复:
class Foo:
def __bar(self):
pass
def baz(self):
return self.__bar()
foo = Foo()
foo.baz()
基于此,您可以创建单元测试方法,而无需像这样禁用 W0212:
class SomeClass:
""" some docstring
"""
def __init__(self) -> None:
self.myattr = 1
def __my_protected_method(self):
return self.myattr + 1
def __another_protected_method(self):
return self.myattr + 2
def method_for_unittests(self, method_name):
if method_name == "my_protected_method":
return self.__my_protected_method()
if method_name == "another_protected_method":
return self.__another_protected_method()
return None
这似乎是比使用单独的 .pylintrc
(建议 here)更好的解决方案。这就引出了以下问题:
- 我的解决方案是否有意义,还是我们应该坚持使用
#pylint: disable=protected-access
? - 或者您是否有使用特殊装饰器的更好解决方案?我看到了一些东西here,这让我很好奇。我没有编写装饰器的经验,所以比较幼稚。
使用 pylint 始终可以禁用该消息,或使用 hack 使其消失。但最好是简单地禁用消息而不是破解一些可以使 pylint 停止抱怨(但不会使代码更好)的东西。最好的办法是了解根本问题以解决它。
如果您正在创建一个仅用于测试的函数(仅测试 API),那么您就是在进行黑客攻击,让 pylint 认为您正在使用 public API。您应该做的是通过函数的 public 接口(通过到处使用的真实 API 测试 private/protected 方法,正如@jonrscharpe 在评论中指出的那样。
如果您不能这样做,则意味着私有 class 隐藏在您的代码中等待创建。
通告:我们正在尝试将您在问题中链接到 pylint 的 valid-phoenix 的文档工作包括在内并进行改进。您可以帮助 pylint 团队提出更好的修复建议,请参阅 https://github.com/PyCQA/pylint/issues/5953