동적 언어를 사용하는 것은 일시적인 즐거움이며 코드는 화장터에서 재구성됩니다. 이 문장을 들어보셨을 거라 생각합니다. 단위 테스트와 마찬가지로 코드를 작성하는 데 시간이 조금 걸리지만 장기적으로는 매우 가치가 있습니다. 이 기사에서는 Python의 유형 힌트를 더 잘 이해하고 사용하는 방법을 공유합니다.
유형 힌트(PEP 3107부터 도입됨)는 변수, 매개변수, 함수 매개변수 및 해당 반환 값, 클래스 속성 및 메서드에 유형을 추가하는 데 사용됩니다.
Python의 변수 유형은 동적이며 코드에 유형 힌트를 추가하기 위해 런타임에 수정될 수 있습니다. 이는 구문 수준에서만 지원되며 코드 실행에는 영향을 미치지 않습니다. 암호.
따라서 유형 힌트의 직관적인 기능은 코드의 가독성을 향상시켜 호출자가 적절한 유형의 매개변수를 더 쉽게 입력/출력하고 코드 재구성을 용이하게 하는 것입니다.
Python에 내장된 기본 유형을 유형 힌트에 직접 사용할 수 있습니다:
변수에 대한 유형 힌트 예:
a: int = 3 b: float = 2.4 c: bool = True d: list = ["A", "B", "C"] e: dict = {"x": "y"} f: set = {"a", "b", "c"} g: tuple = ("name", "age", "job")
함수에 대한 유형 힌트:
def add_numbers(x: type_x, y: type_y, z: type_z= 100) -> type_return: return x + y + z
type_x, type_y, type_z, type_return 여기에 기본 유형이 내장될 수 있습니다. 또는 사용자 정의 유형일 수 있습니다.
클래스 유형 힌트:
class Person: first_name: str = "John" last_name: str = "Does" age: int = 31
이런 코드가 있는 경우:
x: int = 2 x = 3.5
Python 인터프리터로 실행하면 오류가 발생하지 않습니다.
Just use mypy의 도움으로 먼저 pip install mypy로 설치한 다음 mypy script.py를 사용하세요.
mypy 관련 정보를 더 보려면 Mypy는 Python을 만드는 도구입니다. 유형 힌트는 매우 실용적입니다.
통역사가 유형 힌트를 강제하지 않으면 굳이 유형 힌트를 작성해야 할까요? 유형 힌트가 코드 실행 방식을 변경하지 않는다는 것은 사실입니다. Python은 본질적으로 동적으로 유형이 지정되므로 변경될 가능성이 없습니다. 그러나 개발자 경험의 관점에서 볼 때 유형 힌트에는 많은 이점이 있습니다.
(1) 특히 함수에서 유형 힌트를 사용하여 매개변수 유형과 생성된 결과 유형을 명확히 하세요. 이는 읽고 이해하기 매우 쉽습니다.
(2) 힌트를 입력하면 인지 오버헤드가 제거되고 코드를 더 쉽게 읽고 디버깅할 수 있습니다. 입력과 출력의 유형을 고려하면 개체와 개체 호출 방법을 쉽게 추론할 수 있습니다.
(3) 유형 힌트는 코드 편집 경험을 향상시킬 수 있습니다. IDE는 유형 검사를 사용하여 코드를 정적으로 분석하고 잠재적인 오류(예: 잘못된 유형의 매개변수 전달, 잘못된 메서드 호출 등)를 감지하는 데 도움을 줄 수 있습니다. 또한 유형 힌트를 기반으로 각 변수에 대해 자동 완성이 제공됩니다.
IDE 유형 검사
IDE 유형 검사
IDE 유형 검사 후 자동 완성
목록이 필요한 경우 목록의 내부 부분은 부동 소수점입니다. 힌트를 입력하면 불가능합니다.
def my_dummy_function(l: list[float]): return sum(l)
표준 라이브러리 타이핑에서는 이 문제를 고려하여 다음을 수행할 수 있습니다.
from typing import List def my_dummy_function(vector: List[float]): return sum(vector)
이러한 유형을 프롬프트하려면:
my_dict = {"name": "Somenzz", "job": "engineer"}
의 도움으로 Dict, 다음과 같이 유형을 정의할 수 있습니다.
from typing import Dict my_dict_type = Dict[str, str] my_dict: my_dict_type = {"name": "Somenzz", "job": "engineer"}
이러한 유형을 요청해야 하는 경우 어떻게 해야 합니까?
d = {"name": "Somenzz", "interests": ["chess", "tennis"]}
TypedDict의 도움으로 다음을 수행할 수 있습니다.
TypedDict
Python 3.10부터 Union은 | 이제 X|Y와 동일합니다.
Union[X, Y](또는 X | Y)는 X 또는 Y를 의미합니다.
함수가 캐시 디렉터리에서 파일을 읽고 Torch 모델을 로드해야 한다고 가정해 보겠습니다. 이 캐시 디렉터리 위치는 문자열 값(예: /home/cache)이거나 Pathlib 라이브러리의 Path 개체일 수 있습니다. 이 경우 코드는 다음과 같습니다.
def load_model(filename: str, cache_folder: Union[str, Path]): if isinstance(cache_folder, Path): cache_folder = str(cache_folder) model_path = os.join(filename, cache_folder) model = torch.load(model_path) return model
from typing import Callable def sum_numbers(x: int, y: int) -> int: return x + y def foo(x: int, y: int, func: Callable) -> int: output = func(x, y) return output foo(1, 2, sum_numbers)해당 함수 매개변수에 대한 매개변수 목록을 지정할 수도 있는데 이는 정말 강력합니다. 구문:
Callable[[input_type_1, ...], return_type]예:
def foo(x: int, y: int, func: Callable[[int, int], int]) -> int: output = func(x, y) return output
当你传入的参数可以为任何类型的时候,就可以使用 Any
def bar(input: Any): ...
如果你的函数使用可选参数,具有默认值,那么你可以使用类型模块中的 Optional 类型。
from typing import Optional def foo(format_layout: Optional[bool] = True): ...
Sequence 类型的对象是可以被索引的任何东西:列表、元组、字符串、对象列表、元组列表的元组等。
from typing import Sequence def print_sequence_elements(sequence: Sequence[str]): for i, s in enumerate(s): print(f"item {i}: {s}"
Tuple 类型的工作方式与 List 类型略有不同,Tuple 需要指定每一个位置的类型:
from typing import Tuple t: Tuple[int, int, int] = (1, 2, 3)
如果你不关心元组中每个元素的类型,你可以继续使用内置类型 tuple。
t: tuple = (1, 2, 3, ["cat", "dog"], {"name": "John"})
类型提示在代码之上带来了额外的抽象层:它们有助于记录代码,澄清关于输入/输出的假设,并防止在顶部执行静态代码分析 (mypy) 时出现的隐蔽和错误。
위 내용은 Python의 유형 힌트에 대한 모범 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!