如何让 ruff 在 python 中将属性理解为“受保护”?

问题描述 投票:0回答:1

我正在尝试使用类似于 python 中受保护属性的东西,并且我使用 ruff 作为 linter。当然,我知道 python 不是支持访问保护的语言,但 ruff 有一个 linting 规则 SLF001,我发现它非常实用并且我想使用。

通常我希望我的 linter 表现得像这样

class MyClass:
    def __init__(self, value: int):
        self._value = value

    def is_lt(self, other: "MyClass") -> bool:
        return self._value < other._value  # Does not raise lint errors


a = MyClass(3)
print(a._value)  # Raises lint errors

我遇到的问题是 ruff 规则 SLF001 会触发

is_lt
方法中的代码错误,如果我希望不触发该错误。

当然,我考虑过全局禁用该规则,但案例中的错误

print(a._value)
不会被覆盖,这不是我想要的。

目前我发现的最佳解决方案是在本地禁用线路上的规则

return self._value < other._value
,但由于明显的原因它不能满足我。

有令人满意的解决方案还是我必须忘记这个 linting 规则?

编辑:
我正在使用 python 版本 3.11.4 和 ruff 版本 0.2.2。
Grismar 还指出,如果我的方法有一个像

__lt__

这样的“特殊”名称,则不会引发错误
python oop protected ruff
1个回答
0
投票

确实,Ruff 正在做正确的事情。您正在访问

MyClass
的私有成员,但不应访问它。这完全是另一个例子。

您可以创建一个公共属性来访问该属性:

class MyClass:
    def __init__(self, value: int) -> None:
        self._value = value

    @property
    def value(self) -> int:
        return self._value

    def is_lt(self, other: "MyClass") -> bool:
        return self._value < other.value
        # or
        # return self.value < other.value


a = MyClass(3)
print(a._value)  # Raises lint errors
© www.soinside.com 2019 - 2024. All rights reserved.