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)更好的解决方案。这就引出了以下问题:

  1. 我的解决方案是否有意义,还是我们应该坚持使用 #pylint: disable=protected-access
  2. 或者您是否有使用特殊装饰器的更好解决方案?我看到了一些东西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