我正在尝试使用类似于 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__
这样的“特殊”名称,则不会引发错误
确实,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