4 가지 강력한 기능 파이썬이 아직 빠져있다

Python은 살아있는 언어입니다. 시대를 따라 잡기 위해 끊임없이 개발되고 있습니다. Python Software Foundation은 표준 라이브러리와 참조 구현 CPython에 추가 할뿐만 아니라 언어 자체에 새로운 기능과 개선 사항을 도입합니다.

예를 들어, Python 3.8은 특정 작업을보다 간결하게 만드는 인라인 할당 ( "코끼리 연산자")을위한 새로운 구문을 도입했습니다. 새로 승인 된 또 다른 구문 개선 인 패턴 일치를 사용하면 가능한 많은 경우 중 하나를 평가하는 코드를 쉽게 작성할 수 있습니다. 이 두 기능은 모두 다른 언어로의 존재와 유용성에서 영감을 받았습니다.

그리고 그것들은 파이썬에 추가 할 수있는 유용한 기능 중 두 가지에 불과하여 언어를보다 표현력 있고 강력하며 현대 프로그래밍 세계에 더 적합하게 만들기 위해 추가 할 수 있습니다. 또 무엇을 원할까요? 파이썬에 실제 가치를 더할 수있는 4 가지 언어 기능이 더 있습니다. 2 개는 실제로 얻을 수 있고 2 개는 그렇지 않을 것입니다. 

진정한 상수

파이썬에는 실제로 상수 값의 개념이 없습니다. 오늘날 파이썬의 상수는 대부분 관습의 문제입니다. 모두 대문자로 된 이름 (예 : 스네이크 케이스)을 사용 DO_NOT_RESTART 하는 것은 변수가 상수가되도록 의도 된 힌트입니다. 마찬가지로  typing.Final 유형 주석은 객체를 수정해서는 안된다는 힌트를 linter에 제공하지만 런타임에이를 적용하지는 않습니다.

왜? 가변성은 파이썬의 행동에 깊이 뿌리 내리고 있기 때문입니다. 예를 들어 변수에 값을 할당  x=3 하면 로컬 네임 스페이스에 이름을 만들고  x정수 값을 가진 시스템의 개체를 가리 킵니다  3. 파이썬은 항상 이름이 변경 가능하다고 가정 합니다. 어떤 이름 이든 객체를 가리킬 수 있습니다. 즉, 이름이 사용될 때마다 파이썬은 자신이 가리키는 객체를 찾는 데 어려움을 겪습니다. 이러한 역동 성은 파이썬이 다른 언어보다 느리게 실행되는 주된 이유 중 하나입니다. Python의 역동 성은 뛰어난 유연성과 편리함을 제공하지만 런타임 성능이 저하됩니다.

Python에서 진정한 상수 선언을 갖는 한 가지 이점은 런타임 중에 발생하는 객체 조회 빈도를 줄여 성능을 향상시킬 수 있다는 것입니다. 런타임이 주어진 값이 절대 변경되지 않는다는 것을 미리 알고있는 경우 바인딩을 조회 할 필요가 없습니다. 이는 또한 Python 앱 (Cython, Nuitka)에서 머신 네이티브 코드를 생성하는 시스템과 같은 타사 최적화를위한 길을 제공 할 수 있습니다.

그러나 실제 상수는 주요 변경 사항이며 이전 버전과 호환되지 않는 변경 일 가능성이 높습니다. 상수가 새로운 구문 (예 : 아직 사용되지 않은 $ 기호)을 통해 올 것인지 아니면 이름을 선언하는 Python의 기존 방식의 확장으로 올 것인지는 논쟁의 여지가  있습니다. 마지막으로, 역 동성이 매력의 큰 부분을 차지한 언어에서 진정한 상수가 의미가 있는지 여부에 대한 더 크고 철학적 인 질문이 있습니다.

요컨대, 우리는 파이썬에서 진정한 상수를 볼 수 있지만 그것은 주요한 변경 사항이 될 것입니다.

진정한 과부하 및 제네릭

많은 언어에서 동일한 함수의 여러 버전을 작성하여 다른 종류의 입력으로 작업 할 수 있습니다. 예를 들어,  to_string() 함수는 정수, 부동 소수점 숫자 또는 기타 객체로부터 변환하기 위해 다른 구현을 가질 수 있지만 편의상 동일한 이름을 공유합니다. "오버로딩"또는 "제네릭"을 사용하면 특정 유형에 대한 메서드를 사용하는 대신 일반 프로세스에 대한 제네릭 메서드를 작성할 수 있으므로 강력한 소프트웨어를 더 쉽게 작성할 수 있습니다.

Python은 하나의 함수 이름을 사용하여 여러 작업을 수행하도록 허용하지만 함수의 여러 인스턴스를 정의하는 것은 아닙니다. 주어진 범위에서 이름을 한 번만 정의하고 한 번에 하나의 개체에만 바인딩 할 수 있으므로 같은 이름으로 단일 함수의 여러 버전을 가질 수 없습니다.

파이썬 개발자가 일반적으로이 문제를 해결하기 위해하는 일은 내장 기능을 사용  isinstance() 하거나  type() 함수에 제출 된 변수 유형을 결정한 다음 유형에 따라 조치를 취하는 것입니다. 때때로 여기에는 내부적으로 함수의 유형별 버전에 대한 디스패치가 포함됩니다. 그러나이 접근 방식은 확장 가능하게 만들지 않는 한 다른 개발자가 함수를 확장하는 것을 어렵게 만듭니다. 예를 들어, 하위 클래스가 될 수있는 클래스 내의 메서드로 디스패치하는 방식입니다.

2007 년 4 월에 발전된 PEP 3124는 기능이 과부하 될 수 있음을 나타 내기 위해 기능을 장식하는 메커니즘을 제안했습니다. 제안은 완전히 거부되지 않고 연기되었습니다. 즉, 아이디어는 근본적으로 건전했지만 구현하기에 적절하지 않았습니다. 파이썬에서 오버로딩의 채택 속도를 높이거나 아이디어를 완전히 버릴 수있는 한 가지 요인은 새로 제안 된 패턴 매칭 시스템의 구현입니다.

이론적으로는 패턴 매칭을 사용하여 과부하 디스패치를 ​​처리 할 수 ​​있습니다. 그러나 패턴 일치는 Python에서 제네릭을 구현 하지 않는 이유로도 주어질 수 있습니다. 이미 형식 서명을 기반으로 작업을 디스패치하는 우아한 방법을 제공하기 때문입니다.

그래서 언젠가 파이썬에서 진정한 오버로딩을 얻거나 그 장점이 다른 메커니즘으로 대체 될 수 있습니다.

꼬리 재귀 최적화

많은 언어 컴파일러는 자신을 호출하는 함수가 애플리케이션에서 새로운 스택 프레임을 생성하지 않기 때문에 너무 오래 실행되면 스택이 폭발 할 위험이있는 테일 재귀 최적화를 사용합니다. 파이썬은 이것을하지 않으며, 사실 그 제작자들은 일관되게 그렇게하는 것에 반대해 왔습니다.

한 가지 이유는 파이썬의 대부분이 내부에서 보면 재귀  보다는 반복을 사용  하기 때문입니다 (   제너레이터, 코 루틴 등). 이 경우 순환 메커니즘 대신 루프와 스택 구조가있는 함수를 사용하는 것을 의미합니다. 루프의 각 호출을 스택에 저장하여 새로운 재귀를 생성하고 재귀가 완료되면 스택에서 튀어 나올 수 있습니다.

Python 개발자는 재귀 대신 이러한 패턴을 사용하도록 권장되므로 재귀 최적화에 대한 희망이 거의없는 것 같습니다. Python의 관용구가 다른 솔루션을 지원하기 때문에 여기에서 가능성은 전혀 없습니다.

여러 줄 람다

Lambdas 또는 익명 함수는 언어 제작자 인 Guido van Rossum의 저항을받은 후에 만 ​​Python으로 만들었습니다. Python 람다는 현재 존재하므로 매우 제한적입니다. 단일 표현식 (본질적으로 할당 연산에서 등호 오른쪽에있는 모든 것) 만 함수 본문으로 사용할 수 있습니다. 완전한 문장 블록을 원한다면, 그것들을 분리하여 실제 함수를 만드십시오.

그 이유는 van Rossum이 보는 언어의 디자인 때문입니다. 반 로섬은 2006 년에 쓴 것처럼, "나는 찾을  어떤  식의 중간에 들여 기반 블록을 내장하고 받아 들일 수없는 해결책을. 문 그룹화에 대한 대체 구문 (예 : 중괄호 또는 시작 / 끝 키워드)을 똑같이 받아 들일 수 없다는 것을 발견했기 때문에 이것은 거의 여러 줄로 된 람다를 풀 수없는 퍼즐로 만듭니다.”

즉, 문제는 기술적 인 것이 아니라 Python 구문의 기존 미학을 보완하는 여러 줄 람다에 대한 구문이 부족하다는 것입니다. 특별한 경우를 만들지 않는 방법은 아마 없을 것이고, 특별한 경우가 발생하는 언어는 사용하기가 불편 해지는 경향이 있습니다. 그런 유니콘이 나타날 때까지 우리는 별도로 정의 된 함수로 작업을해야합니다.

여러 줄 람다는 아마도 Python에서 발생하지 않을 것입니다.

Python에 대해 자세히 알아보세요.

  • Python 3.9 : 새로운 기능과 향상된 기능
  • Python 3.8의 가장 새로운 기능
  • Poetry로 더 나은 Python 프로젝트 관리
  • Virtualenv 및 Venv : Python 가상 환경 설명
  • Python virtualenv 및 venv해야 할 일과하지 말아야 할 일
  • Python 스레딩 및 하위 프로세스 설명
  • Python 디버거를 사용하는 방법
  • timeit을 사용하여 Python 코드를 프로파일 링하는 방법
  • cProfile을 사용하여 Python 코드를 프로파일 링하는 방법
  • Python에서 비동기 시작하기
  • Python에서 asyncio를 사용하는 방법
  • Python을 JavaScript로 변환하는 방법 (그리고 다시)
  • Python 2 EOL : Python 2의 끝에서 살아남는 방법
  • 모든 프로그래밍 요구를위한 12 개의 Python
  • 모든 Python 개발자를위한 24 개의 Python 라이브러리
  • 놓쳤을 수도있는 7 가지 멋진 Python IDE
  • Python의 3 가지 주요 단점 및 솔루션
  • 13 개의 Python 웹 프레임 워크 비교
  • 버그를 제거하는 4 가지 Python 테스트 프레임 워크
  • 놓치고 싶지 않은 6 가지 새로운 Python 기능
  • 기계 학습 마스터를위한 5 가지 Python 배포
  • 자연어 처리를위한 8 가지 훌륭한 Python 라이브러리
  • 병렬 처리를위한 6 개의 Python 라이브러리
  • PyPy는 무엇입니까? 고통없는 더 빠른 Python
  • Cython은 무엇입니까? C 속도의 Python