문제 상황
SQLAlchemy를 사용해 상품 목록을 조회하는 조건식을 작성하던 중, Ruff에서 다음과 같은 경고가 발생했습니다.
services\product-service\app\routes\products.py:94:27: E712 Avoid equality comparisons to `True`; use `if Product.is_active:` for truth checks
문제가 된 코드는 다음과 같습니다.
conditions.append(Product.is_active == True)
Ruff의 E712 규칙은 Python 코드에서 True, False와 직접 비교하는 패턴을 피하라는 경고입니다.
일반적인 Python 코드에서는 다음과 같은 비교를 권장하지 않습니다.
if value == True:
...
대신 아래처럼 truthy/falsy 평가를 사용하는 것이 더 자연스럽습니다.
if value:
...
일반 Python 코드에서 문제가 되는 이유
Python에서는 Boolean 값을 직접 == True, == False로 비교하지 않아도 조건문에서 참/거짓을 평가할 수 있습니다.
예를 들어 다음과 같은 코드는 불필요한 비교로 볼 수 있습니다.
if is_active == True:
...
보통은 다음과 같이 작성하는 것이 더 Pythonic합니다.
if is_active:
...
따라서 Ruff는 == True 같은 표현을 발견하면 E712 경고를 발생시킵니다.
SQLAlchemy에서는 상황이 다르다
하지만 SQLAlchemy의 where 조건식에서는 일반적인 Python Boolean 비교와 의미가 다릅니다.
conditions.append(Product.is_active == True)
위 코드는 Python의 Boolean 값을 단순 비교하는 코드가 아니라, SQLAlchemy가 SQL 조건식을 만들기 위한 표현식입니다.
즉, 의도는 다음과 같은 SQL 조건을 만드는 것입니다.
WHERE product.is_active = true
따라서 일반 Python 코드 기준으로는 E712 경고 대상이지만, SQLAlchemy 표현식에서는 의도된 사용일 수 있습니다.
이런 경우 Ruff 입장에서는 SQLAlchemy의 표현식 생성 의도를 정확히 구분하기 어렵기 때문에 오탐처럼 보일 수 있습니다.
해결 방법
SQLAlchemy에서는 Boolean 또는 NULL 비교를 위해 is_() 메서드를 사용할 수 있습니다.
변경 전 코드는 다음과 같습니다.
conditions.append(Product.is_active == True)
이를 아래와 같이 변경할 수 있습니다.
conditions.append(Product.is_active.is_(True))
이렇게 작성하면 Ruff의 E712 경고를 피하면서도, SQLAlchemy 표현식이라는 의도를 더 명확하게 드러낼 수 있습니다.
변경 전후 비교
변경 전
conditions.append(Product.is_active == True)
변경 후
conditions.append(Product.is_active.is_(True))
참고: None 비교도 같은 방식으로 처리 가능
SQLAlchemy 공식 문서에서도 None 비교에 대해 비슷한 예시를 제공합니다.
statement.where(users.c.name == None)
PEP8 또는 linter 경고가 신경 쓰이는 경우, 다음과 같이 is_()를 사용할 수 있습니다.
statement.where(users.c.name.is_(None))
Boolean 조건에서도 같은 방식으로 is_(True) 또는 is_(False)를 사용할 수 있습니다.
Product.is_active.is_(True)
Product.is_active.is_(False)
정리
Ruff의 E712는 일반 Python 코드에서 == True, == False 비교를 피하도록 안내하는 규칙입니다.
하지만 SQLAlchemy에서는 Product.is_active == True 같은 표현이 SQL 조건식을 만들기 위한 코드로 사용될 수 있습니다. 이 경우 일반적인 Python truth check와는 의미가 다르기 때문에 linter 경고가 오탐처럼 느껴질 수 있습니다.
이 문제는 SQLAlchemy의 is_() 메서드를 사용해 해결할 수 있습니다.
conditions.append(Product.is_active.is_(True))
결과적으로 linter 경고를 제거하면서도, SQLAlchemy 조건식의 의도를 더 명확하게 표현할 수 있었습니다.
Reference
- SQLAlchemy 공식 문서: https://docs.sqlalchemy.org/en/14/core/tutorial.html
'Language > Python' 카테고리의 다른 글
| FastAPI Depends()에서 Ruff B008 경고가 발생할 때 해결 방법 (0) | 2026.05.20 |
|---|---|
| Python 타입 힌트: Optional, Union, T | None 차이 정리 (0) | 2026.05.20 |