しばらくの間動的言語を使用するのは素晴らしいことです。コードは火葬場で再構築されます。単体テストと同様に、コードを書くのに少し時間はかかりますが、長い目で見ると非常に価値のある作業です。この記事では、Python の型ヒントをよりよく理解し、使用する方法を説明します。
型ヒント (PEP 3107 以降導入) は、変数、パラメーター、関数パラメーターとその戻り値、クラス属性、およびメソッドの種類。
Python の変数型は動的であり、実行時に変更してコードに型ヒントを追加できます。これは構文レベルでのみサポートされており、コードの実行には影響しません。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
here 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 インタープリターで実行するとエラーは発生しません:
mypy を使用して、まず pip install mypy でインストールし、次に mypy スクリプトを実行します。 .py:
mypy 関連の詳細については、前の記事 mypy を参照してください。このツールを使用すると、Python の型ヒントが非常に実用的になります。
インタープリターが型ヒントを強制しない場合、なぜ型ヒントを記述する必要があるのでしょうか。確かに、型ヒントによってコードの実行方法が変わるわけではありません。Python は本質的に動的に型付けされており、それが変わる可能性は低いです。ただし、開発者のエクスペリエンスという観点から見ると、型ヒントには多くの利点があります。
(1) 特に関数で型ヒントを使用すると、パラメーターの型と生成される結果の型が明確になり、非常に読みやすく理解しやすくなります。
(2) 型ヒントは認知的なオーバーヘッドを排除し、コードの読み取りとデバッグを容易にします。入力と出力のタイプがわかれば、オブジェクトとその呼び出し方法を簡単に推測できます。
(3) 型ヒントにより、コード編集エクスペリエンスが向上します。 IDE は型チェックを利用してコードを静的に分析し、潜在的なエラー (例: 間違った型のパラメータを渡したり、間違ったメソッドを呼び出したりするなど) を検出するのに役立ちます。さらに、型ヒントに基づいて変数ごとにオートコンプリートが提供されます。
IDE の型チェック
IDE の型チェック
IDE 型チェック後の自動補完
リスト内に float 型のヒントが必要な場合、これは機能しません:
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"}
ヘルプを使用
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 は | に置き換えられます。これは、Union[X, Y] が 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
関数をパラメーターとして渡す必要がある場合、このパラメーターの型ヒントを Callable にすることができます。
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 中国語 Web サイトの他の関連記事を参照してください。