모든 개발자가 여전히 겪고 있는 ython 버그와 해결 방법)

WBOY
풀어 주다: 2024-08-31 06:00:36
원래의
483명이 탐색했습니다.

ython bugs that every developer is still facing in and how to fix them)

작성자: Rupesh Sharma AKA @hackyrupesh

간단함과 아름다움을 지닌 Python은 세계에서 가장 인기 있는 프로그래밍 언어 중 하나입니다. 그러나 2024년에도 특정 결함이 계속해서 개발자를 괴롭히고 있습니다. 이러한 문제는 항상 Python의 약점으로 인한 것이 아니라 예상치 못한 결과를 초래하는 Python의 설계, 동작 또는 일반적인 오해로 인해 발생합니다. 이 블로그 기사에서는 2024년에도 모든 개발자가 여전히 직면하게 되는 5가지 Python 문제와 해결 방법을 살펴보겠습니다.


1. 변경 가능한 기본 인수: 조용한 함정

문제

가장 악명 높은 Python 버그 중 하나는 변경 가능한 기본 인수입니다. 목록이나 사전과 같은 변경 가능한 객체가 함수의 기본 인수로 사용되면 Python은 함수가 호출될 때마다가 아니라 함수가 정의될 ​​때 이 기본 인수를 한 번만 평가합니다. 이로 인해 함수가 객체를 수정할 때 예상치 못한 동작이 발생합니다.

def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [1, 2] - Unexpected!
print(append_to_list(3))  # Outputs: [1, 2, 3] - Even more unexpected!
로그인 후 복사

해결책

이를 방지하려면 None을 기본 인수로 사용하고 필요한 경우 함수 내부에 새 목록을 생성하세요.

def append_to_list(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [2]
print(append_to_list(3))  # Outputs: [3]
로그인 후 복사

참고자료

  • Python의 기본 인수 문제

2. 사전의 파악하기 어려운 키 오류

문제

존재하지 않는 사전 키에 액세스하려고 하면 KeyError가 발생합니다. 이는 중첩된 사전을 사용하거나 구조가 보장되지 않는 데이터를 처리할 때 특히 까다로울 수 있습니다.

data = {'name': 'Alice'}
print(data['age'])  # Raises KeyError: 'age'
로그인 후 복사

해결책

KeyError를 방지하려면 키를 찾을 수 없는 경우 None(또는 지정된 기본값)을 반환하는 get() 메서드를 사용하세요.

print(data.get('age'))  # Outputs: None
print(data.get('age', 'Unknown'))  # Outputs: Unknown
로그인 후 복사

중첩 사전의 경우 컬렉션 모듈이나 dotmap 또는 pydash와 같은 라이브러리의 defaultdict 사용을 고려하세요.

from collections import defaultdict

nested_data = defaultdict(lambda: 'Unknown')
nested_data['name'] = 'Alice'
print(nested_data['age'])  # Outputs: Unknown
로그인 후 복사

참고자료

  • Python KeyError 및 처리 방법

3. 시도 예외 남용으로 인한 자동 오류

문제

try-Exception 블록을 과도하게 사용하거나 오용하면 예외가 포착되지만 제대로 처리되지 않는 자동 오류가 발생할 수 있습니다. 이로 인해 버그 감지 및 디버깅이 어려워질 수 있습니다.

try:
    result = 1 / 0
except:
    pass  # Silently ignores the error
print("Continuing execution...")
로그인 후 복사

위의 예에서는 ZeroDivisionError가 포착되어 무시되지만 이로 인해 근본적인 문제가 가려질 수 있습니다.

해결책

항상 포착하려는 예외 유형을 지정하고 적절하게 처리하세요. 오류를 기록하면 문제를 추적하는 데 도움이 될 수도 있습니다.

try:
    result = 1 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
print("Continuing execution...")
로그인 후 복사

광범위한 예외 처리를 위해 패스 대신 로깅을 사용할 수 있습니다.

import logging

try:
    result = 1 / 0
except Exception as e:
    logging.error(f"Unexpected error: {e}")
로그인 후 복사

참고자료

  • Python의 Try-Exception 모범 사례

4. 정수 나눗셈: 잘림의 함정

문제

Python 3 이전에는 두 정수의 나눗셈이 기본적으로 바닥 나눗셈을 수행하여 결과를 정수로 자릅니다. Python 3에서는 진정한 나눗셈(/)으로 이 문제를 해결했지만 일부 개발자는 의도하지 않게 바닥 나눗셈(//)을 사용할 때 여전히 문제에 직면합니다.

print(5 / 2)  # Outputs: 2.5 in Python 3, but would be 2 in Python 2
print(5 // 2)  # Outputs: 2
로그인 후 복사

해결책

특별히 바닥 구분이 필요하지 않은 한 구분에는 항상 /를 사용하세요. Python 2에서 Python 3으로 코드를 포팅할 때는 주의하세요.

print(5 / 2)  # Outputs: 2.5
print(5 // 2)  # Outputs: 2
로그인 후 복사

명확하고 예측 가능한 코드를 위해 10진수 사용을 고려해 보세요. 특히 재무 계산에서 더 정확한 산술 연산을 위해 Decimal을 사용하세요.

from decimal import Decimal

print(Decimal('5') / Decimal('2'))  # Outputs: 2.5
로그인 후 복사

참고자료

  • 파이썬 구분: / vs //

5. 순환 참조로 인한 메모리 누수

문제

Python의 가비지 수집기는 대부분의 메모리 관리를 처리하지만 순환 참조는 올바르게 처리되지 않으면 메모리 누수를 일으킬 수 있습니다. 두 개 이상의 객체가 서로 참조하는 경우 가비지 수집되지 않아 메모리 사용량이 증가할 수 있습니다.

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1  # Circular reference

del node1
del node2  # Memory not freed due to circular reference
로그인 후 복사

해결책

순환 참조를 피하려면 약한 참조 모듈을 통해 약한 참조를 사용하는 것이 좋습니다. 그러면 강한 참조가 없을 때 참조가 가비지 수집될 수 있습니다.

import weakref

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)  # No circular reference now
로그인 후 복사

또는 개체를 삭제하기 전에 참조를 없음으로 설정하여 수동으로 주기를 중단할 수 있습니다.

node1.next = None
node2.next = None
del node1
del node2  # Memory is freed
로그인 후 복사

References

  • Python Memory Management and Garbage Collection

Conclusion

Even in 2024, Python developers continue to encounter these common bugs. While the language has evolved and improved over the years, these issues are often tied to fundamental aspects of how Python works. By understanding these pitfalls and applying the appropriate solutions, you can write more robust, error-free code. Happy coding!


Written by Rupesh Sharma AKA @hackyrupesh

위 내용은 모든 개발자가 여전히 겪고 있는 ython 버그와 해결 방법)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿