>  기사  >  백엔드 개발  >  Python: 흥미로운 코드 패턴

Python: 흥미로운 코드 패턴

王林
王林원래의
2024-09-08 06:36:02868검색

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 사용자인 사용자가 사용하는 코드 기반도 있습니다. 그리고, 라인이 무엇을 하는지 추측해야 한다면, 명확하게 보이도록 바꿔야 한다고 생각합니다.

이것에 대해 어떻게 생각하시나요? 불리언을 인덱스로 사용하시나요?
이런 파이썬 패턴이 또 있나요?

위 내용은 Python: 흥미로운 코드 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.