Python 버전 3.5에는 코드를 더 읽기 쉽게 만들고 개발자가 서로의 코드를 쉽게 이해할 수 있도록 '유형 힌트'가 도입되었습니다.
유형 힌트가 왜 중요한가요?
Java, C 등 강형 언어에서는 종속성 역전(DI - dependency Inversion)이 중요한 기술이지만 약형 언어에서는 구현하기 어렵습니다.
종속성 역전의 핵심 아이디어는 클래스가 특정 구현에 의존하지 않고 추상화에 의존해야 한다는 것입니다. 추상화(인터페이스 또는 추상 클래스)는 상대적으로 안정적인 계약이기 때문입니다.
나쁜 예:
class GasStation: def fill_tank(car, amount): car.fill(amount)
이 예에서 주유소에서는 자동차에 주유만 할 수 있습니다. 설상가상으로 fill_tank
함수에는 정의된 유형이 없으므로 모든 값이 전달될 수 있으며 오류는 런타임에만 발견됩니다.
좋은 예:
from typing import Protocol class Vehicle(Protocol): def fill(amount: int) -> None: ... class GasStation: def fill_tank(vehicle: Vehicle, amount: int) -> None: vehicle.fill(amount)
이 예에서는 먼저 추상 클래스 Vehicle
를 정의합니다(typing.Protocol
사용). GasStation
의 fill_tank
기능은 더 이상 특정 자동차 클래스에 의존하지 않고 Vehicle
인터페이스에 의존하므로 더욱 일반화되고 fill
메서드를 구현하는 모든 차량에 연료를 공급할 수 있습니다.
PyDIT란 무엇인가요?
Python의 유형 힌트 시스템을 활용하여 PyDIT(Python 종속성 주입 with 유형)라는 종속성 반전 사용을 단순화하는 라이브러리를 만들었습니다.
사용자 데이터를 저장하기 위한 데이터베이스 인터페이스가 필요하다고 가정해 보겠습니다. PostgreSQL, MySQL, OracleDB, 인메모리 데이터베이스 또는 NoSQL 데이터베이스를 사용하든 데이터베이스 연결 클래스를 구현하고 레코드 읽기, 쓰기 및 삭제 기능을 제공해야 합니다. .
from time import sleep from typing import TypedDict from typing_extensions import override from uuid import UUID from src.configs.di import pydit from src.adapters.repositories.interfaces.user import UserRepository from src.constants.injection import MEMORY_REPOSITORY_CONFIG_TOKEN from src.domain.user.models.user import UserModel class ConfigType(TypedDict): delay: int class MemoryUserRepository(UserRepository): __users: dict[UUID, UserModel] = {} def __init__(self): self.__delay = self.config.get("delay", 0.2) @pydit.inject(token=MEMORY_REPOSITORY_CONFIG_TOKEN) def config(self) -> ConfigType: # TODO: supress return type error pass @override def get_by_id(self, *, id_: UUID) -> UserModel: sleep(self.__delay) user = self.__users.get(id_) if user is None: raise ValueError("User not found") return user @override def save(self, *, data: UserModel) -> None: sleep(self.__delay) self._check_pk_conflict(pk=data.id) self.__users[data.id] = data @override def list_(self) -> list[UserModel]: return list(self.__users.values()) def _check_pk_conflict(self, *, pk: UUID) -> None: if pk not in self.__users: return raise ValueError("Primary key conflicts: DB alrady has a user with this ID")
코드가 데이터베이스 기술과 아무 관련이 없는지 확인하려면 모든 데이터베이스 클래스가 따라야 하는 인터페이스를 정의하세요.
from abc import abstractmethod from typing import Protocol from uuid import UUID from src.domain.user.models.user import UserModel class UserRepository(Protocol): @abstractmethod def get_by_id(self, *, id_: UUID) -> UserModel: pass @abstractmethod def save(self, *, data: UserModel) -> None: pass @abstractmethod def list_(self) -> list[UserModel]: pass
다음으로 주입을 위한 종속성을 초기화합니다.
from src.adapters.repositories.in_memory.user import MemoryUserRepository from src.constants.injection import MEMORY_REPOSITORY_CONFIG_TOKEN from .di import pydit from .get_db_config import get_db_config def setup_dependencies(): pydit.add_dependency(get_db_config, token=MEMORY_REPOSITORY_CONFIG_TOKEN) pydit.add_dependency(MemoryUserRepository, "UserRepository")
마지막으로 사용자를 생성하는 모듈에 종속성을 삽입합니다.
from typing import cast from src.adapters.repositories.interfaces.user import UserRepository from src.configs.di import pydit from src.domain.user.models.create_user import CreateUserModel from src.domain.user.models.user import UserModel from src.domain.user.services.create import CreateUserService from src.domain.user.services.list import ListUsersService class UserModule: @pydit.inject() def user_repository(self) -> UserRepository: return cast(UserRepository, None) def create(self, data: CreateUserModel) -> None: CreateUserService(self.user_repository).execute(data) def list_(self) -> list[UserModel]: return ListUsersService().execute()
종속성은 속성으로 주입되며 self
또는 module.user_repository
을 통해 액세스할 수 있습니다.
이 예는 간단하지만 PyDIT는 다양한 프로젝트 구성, 코드 추상화 및 SOLID 원칙 시나리오에 적용될 수 있습니다. 코드를 시도하고 기여해 주셔서 감사합니다!
코드 저장소: Github
LinkedIn: Marcelo Almeida(MrM4rc)
PyPI: python-pydit
위 내용은 Python에서 타이핑이 미치는 영향의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

예, youcanconcatenatelistsusingaloopinpython.1) useeparateloopsforeachlisttoAppenditemStoAresultlist.2) USEANESTEDLOOPTOINTERATEREATERVUNTIPLELISTSFORAMORECOCISOPPOACH.3) ApplyDingConcatenation, likefilterningevennumbers

themostefficientmethodsforconcatenatinglistsinpythonare : 1) theextend () methodforin-placemodification, 2) itertools.chain () formemoryefficiencywithlargedatasets.theextend () methodModifiestHeoriginAllist, MakingItMemory-effectrequiretcautionsucution

Pythonloopsincludeforandforandwhilleoops, withforloopsidealfor and with with with withlopsidealforcections and whileleloopsforcondition basedrepetition.bestpracticesinvolve : 1) 사용 listcomprehensionsforsimpletransformations, 2) forindex-valuepairs, 3) optingforrangeoverlistsformemor를 사용합니다

Python은 엄격하게 라인 별 실행이 아니지만 통역사 메커니즘을 기반으로 최적화되고 조건부 실행입니다. 통역사는 코드를 PVM에 의해 실행 된 바이트 코드로 변환하며 상수 표현식을 사전 컴파일하거나 루프를 최적화 할 수 있습니다. 이러한 메커니즘을 이해하면 코드를 최적화하고 효율성을 향상시키는 데 도움이됩니다.

Python에는 두 개의 목록을 연결하는 방법이 많이 있습니다. 1. 연산자 사용 간단하지만 큰 목록에서는 비효율적입니다. 2. 효율적이지만 원래 목록을 수정하는 확장 방법을 사용하십시오. 3. 효율적이고 읽기 쉬운 = 연산자를 사용하십시오. 4. 메모리 효율적이지만 추가 가져 오기가 필요한 itertools.chain function을 사용하십시오. 5. 우아하지만 너무 복잡 할 수있는 목록 구문 분석을 사용하십시오. 선택 방법은 코드 컨텍스트 및 요구 사항을 기반으로해야합니다.

Python 목록을 병합하는 방법에는 여러 가지가 있습니다. 1. 단순하지만 큰 목록에 대한 메모리 효율적이지 않은 연산자 사용; 2. 효율적이지만 원래 목록을 수정하는 확장 방법을 사용하십시오. 3. 큰 데이터 세트에 적합한 itertools.chain을 사용하십시오. 4. 사용 * 운영자, 한 줄의 코드로 중소형 목록을 병합하십시오. 5. Numpy.concatenate를 사용하십시오. 이는 고성능 요구 사항이있는 대규모 데이터 세트 및 시나리오에 적합합니다. 6. 작은 목록에 적합하지만 비효율적 인 Append Method를 사용하십시오. 메소드를 선택할 때는 목록 크기 및 응용 프로그램 시나리오를 고려해야합니다.

CompiledLanguagesOfferSpeedSecurity, while InterpretedLanguagesProvideeaseofusEandportability


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경