diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs index 25bad88d50d526..24920276f35b05 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs @@ -32,7 +32,7 @@ impl EqCmpOp { /// /// ## Why is this bad? /// According to [PEP 8], "Comparisons to singletons like None should always be done with -/// is or is not, never the equality operators." +/// `is` or `is not`, never the equality operators." /// /// ## Example /// ```python @@ -48,7 +48,22 @@ impl EqCmpOp { /// pass /// ``` /// +/// ## Fix safety +/// +/// This rule's fix is marked as unsafe, as it may alter runtime behavior when +/// used with libraries that override the `==`/`__eq__` or `!=`/`__ne__` operators. +/// In these cases, `is`/`is not` may not be equivalent to `==`/`!=`. +/// +/// Notable examples and alternatives include: +/// - `pandas.DataFrame`, often used with `DataFrame.mask`, `DataFrame.where` - see [pandas.DataFrame.eq]. +/// - `pandas.Series`, often used with `Series.mask`, `Series.where` - see [pandas.Series.eq]. +/// - `sqlalchemy.Column`, often used with `Query.having`, `Query.filter`, `Query.where` - see [sqlalchemy.sql.expression.ColumnOperators.is_]. +/// - `numpy.Array`, often used with `Array.where` - no alternative. +/// /// [PEP 8]: https://peps.python.org/pep-0008/#programming-recommendations +/// [pandas.Series.eq]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.eq.html +/// [pandas.DataFrame.eq]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.eq.html +/// [sqlalchemy.sql.expression.ColumnOperators.is_]: https://docs.sqlalchemy.org/en/20/core/sqlelement.html#sqlalchemy.sql.expression.ColumnOperators.is_ #[violation] pub struct NoneComparison(EqCmpOp); @@ -101,7 +116,22 @@ impl AlwaysFixableViolation for NoneComparison { /// ... /// ``` /// +/// ## Fix safety +/// +/// This rule's fix is marked as unsafe, as it may alter runtime behavior when +/// used with libraries that override the `==`/`__eq__` or `!=`/`__ne__` operators. +/// In these cases, `is`/`is not` may not be equivalent to `==`/`!=`. +/// +/// Notable examples and alternatives include: +/// - `pandas.DataFrame`, often used with `DataFrame.mask`, `DataFrame.where` - see [pandas.DataFrame.eq]. +/// - `pandas.Series`, often used with `Series.mask`, `Series.where` - see [pandas.Series.eq]. +/// - `sqlalchemy.Column`, often used with `Query.having`, `Query.filter`, `Query.where` - see [sqlalchemy.sql.expression.ColumnOperators.is_]. +/// - `numpy.Array`, often used with `Array.where` - no alternative. +/// /// [PEP 8]: https://peps.python.org/pep-0008/#programming-recommendations +/// [pandas.Series.eq]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.eq.html +/// [pandas.DataFrame.eq]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.eq.html +/// [sqlalchemy.sql.expression.ColumnOperators.is_]: https://docs.sqlalchemy.org/en/20/core/sqlelement.html#sqlalchemy.sql.expression.ColumnOperators.is_ #[violation] pub struct TrueFalseComparison { value: bool,