"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Python: 흥미로운 코드 패턴

Python: 흥미로운 코드 패턴

2024-09-11에 게시됨
검색:435

Python: Interesting Code Patterns

저는 주로 Python으로 작업하고 거의 매일 코드를 검토합니다. 코드 베이스에서 서식 지정 및 린팅은 black & mypy를 사용하는 CI 작업에 의해 처리됩니다. 그래서 우리는 오직 변화에만 집중합니다.

팀으로 일할 때 특정 팀원에게 어떤 종류의 코드를 기대해야 하는지 이미 알고 있습니다. 새로운 사람이 팀에 합류하면 코드 검토가 흥미로워집니다. 흥미롭게도 모든 사람은 무의식적으로 사용하는 코딩 스타일을 가지고 있습니다. 좋든 나쁘든! 나한테도 좀 있는 것처럼,

  1. Optionaltype의 값을 설정합니다. 일반적으로 이러한 변수는 서명의 일부입니다.
# I used (long back) to do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    if b is None:
       b = []
    if c is None:
       c = {}

# Instead I do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    b = b or []
    c = c or {}
  1. dict를 사용하여 간단한 if..elif..else(최대 3-4개) 문 처리

이것은 문자열을 반환하거나 일부 값을 기반으로 func를 호출하는 간단한 사용 사례입니다.

참고: 3.10부터는 이 대신 match를 사용해야 합니다.

하는 대신,

def get_number_of_wheels(vehicle: str):
    if vehicle == "car":
        wheels = 2
    elif vehicle == "bus":
        wheels = 6
    elif vehicle == "bicycle":
        wheels = 2
    else:
        raise ...

# I prefer doing, 

def get_number_of_wheels(vehicle: str):
    return {
       "car": 2,
       "bus": 6,
       "bicycle": 2
    }[vehicle]       # Raise is now KeyError

위에는 몇 가지 예가 있습니다. 내 코드를 검토하는 사람들은 더 많은 예를 보게 될 것입니다.

최근에 새로운 개발자가 우리 팀에 합류했는데 마음에 드는 패턴을 발견했지만 간단한 if..else 사례로 변경해 달라고 요청했습니다. 먼저 패턴을 보여드리고 변경을 요청하는 이유를 말씀드리겠습니다.

코드는 매개변수에 대해 작업을 수행하는 데코레이터입니다. 함수/메서드가 호출된 인수 및 kwargs 수를 인쇄하는 간단한 (쓸모없는) 데코레이터를 작성해 보겠습니다.

def counter(is_cls_method: bool = False):
    """ print number of args & kwargs for func/method """
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)
            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

@counter()
def test1(a, b, c):
    pass

class A:
    @counter(is_cls_method=True)
    def test1(self, a, b, c):
        pass


print("function")
test1(1, 2, c=3)
test1(a=1, b=2, c=3)

print("method")
a = A()
a.test1(1, 2, 3)
a.test1(1, b=2, c=3)

이 코드를 실행하면 다음과 같은 내용이 표시됩니다.

function
test1 called with args_cnt=2 & kwargs_cnt=1
test1 called with args_cnt=0 & kwargs_cnt=3

method
test1 called with args_cnt=4 & kwargs_cnt=0
test1 called with args_cnt=2 & kwargs_cnt=2

잘 작동하지만 메서드의 경우 자체 계산도 수행합니다. 그러니 고치자!

def counter(is_cls_method: bool = False):
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)

            if is_cls_method:   # Check added
               args_cnt -= 1    # Reduced count by 1

            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

이것은 간단한 if 절이지만 새로운 개발자가 부울을 사용하여 흥미로운 다른 작업을 수행했습니다.

변경된 코드만 보여요...

   args_cnt = len(args[is_cls_method:])

파이썬의 bool은 int이므로 if를 사용하는 것보다 솔루션이 훨씬 낫습니다. 원래 코드는 조금 더 길었고 이 작은 변경 사항은 명확하지 않으며 기본 Python 사용자인 사용자가 사용하는 코드 기반도 있습니다. 그리고, 라인이 무엇을 하는지 추측해야 한다면, 명확하게 변경해야 한다고 생각합니다.

이것에 대한 당신의 생각은 무엇입니까? 부울을 인덱스로 사용합니까?
이런 파이썬 패턴이 더 있나요?

릴리스 선언문 이 기사는 https://dev.to/ninadmhatre/python-interesting-code-patterns-dh3?1에서 복제됩니다. 침해 내용이 있는 경우, [email protected]에 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3