python - 具有访问 protected 成员 : how to avoid? 的属性的 Pylint 警告 `W0212`

标签 python pylint

Pylint 警告对对象的 protected 成员的可疑访问。它知道如何在访问来自对象本身时不发出警告,但不知道如何在访问来自对象的属性时不发出警告。

例如

class C(object):

    def __init__(self):
        C.__a = 0

    a = property(lambda self: self.__a)

Pylint 告诉“W0212 ( protected 访问):访问 protected 成员__a客户类的”

我不想全局禁用 W0212对于每个这样的属性定义,我不满意在本地 (*) 反复禁用它。

是否有解决此问题的已知方法?

(*)如:

class C(object):

    def __init__(self):
        C.__a = 0

    a = property(lambda self: self.__a)  # pylint: disable=W0212

边注

作为一个有趣的旁注,我选择的答案为实际的 Pylint 带来了额外的好处(在未来的版本中可能会改变,我不知道):它保留了 Pylint 检查不存在成员的能力,因为这个测试显示:

class C1(object):

    member = 0


class C2(object):

    def __init__(self):
        self.__a = C1()

    def a(self):
        return self.__a

    @property
    def b(self):
        return self.__a

    c = property(lambda self: self.__a)


def test_member():

    o = C2()

    print(o.a().member)
    print(o.b.member)
    print(o.c.member)


def test_nonexistent():

    o = C2()

    print(o.a().nonexistent)
    print(o.b.nonexistent)
    print(o.c.nonexistent)

您将收到 print(o.a().nonexistent) 的警告和 print(o.b.nonexistent)但不适用于 print(o.c.nonexistent) .

最佳答案

在我看来,您可以使用装饰器,而 linter 可能不会提示:

class C(object):

    def __init__(self):
        self.__a = 0

    @property
    def a(self):
        return self.__a

    # You can use the decorator to create setters too...
    @a.setter
    def a(self, value):
        self.__a = value

因为 linter 可以很容易地将 a 识别为类中的方法。否则,您几乎只能使用列出的选项。您可以全局或本地禁用警告,也可以根本不禁用警告——据我所知,无法仅在特定上下文中禁用警告。

关于python - 具有访问 protected 成员 : how to avoid? 的属性的 Pylint 警告 `W0212`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24833362/

相关文章:

python - 从 Azure DevOps Python Artifacts feed 进行 pip 安装不起作用

python - 使用 Pylint 配置 ALE 插件

python - 导入 pygame 时,在 VScode 中为 pylint 导入失败

python - 你如何告诉 pylint protobuf 生成的对象的成员是什么?

python - 带有 Jenkins 的pylint - 无法找到xml文件的complince

python - 我想以更好的结构打印输出

Python subprocess.call 与 cwd 不工作

python - 如何通过单个 HTTP 请求获取 Python 最新稳定版本的版本号?

python - 从 shell 输出中过滤特殊字符,例如颜色代码

python - 如何在 Visual Studio Code 中配置 pylint 以搜索项目目录中的模块