저는 주로 Python으로 작업하고 거의 매일 코드를 검토합니다. 코드 베이스에서 서식 지정 및 린팅은 black & mypy를 사용하는 CI 작업에 의해 처리됩니다. 그래서 우리는 오직 변화에만 집중합니다.
팀으로 일할 때 특정 팀원에게 어떤 종류의 코드를 기대해야 하는지 이미 알고 있습니다. 새로운 사람이 팀에 합류하면 코드 검토가 흥미로워집니다. 흥미롭게도 모든 사람은 무의식적으로 사용하는 코딩 스타일을 가지고 있습니다. 좋든 나쁘든! 나한테도 좀 있는 것처럼,
# 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 {}
이것은 문자열을 반환하거나 일부 값을 기반으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!