Python での注釈

Vaibhav Vaibhav 2023年1月30日
  1. Python の変数アノテーション
  2. Python での関数アノテーション
Python での注釈

Python は、堅牢で動的に型付けされたプログラミング言語です。平易な英語を書くのに似た単純な構文を持ち、ライブラリと機能の膨大なプールに支えられています。

そのような機能の 1つが注釈です。アノテーションは、変数のデータ型、関数パラメーター、および関数の戻り型に関するヒントを付与する任意の Python 式です。

注釈は、ソースコードの読みやすさと理解を向上させることを目的としており、サードパーティのライブラリによって解釈され、構文ヒント、データ型チェック、IDE でのデータ型ヒント、統合開発環境のオートコンプリートなどの効果的で時間を節約するサービスを提供します。コード、および自動または AI 駆動のドキュメント生成。

Python には、関数アノテーションと変数アノテーションの 2 種類のアノテーションがあります。この記事では、関連する例を使用して、Python の両方のアノテーションタイプについて説明します。

Python の変数アノテーション

変数アノテーションは、Python での変数のデータ型に関する詳細を提供することを目的とした式です。変数アノテーションの構文は次のとおりです。

<variable > : < expression > = < initial value >

注釈式は、変数名とその初期値の間に、コロンまたは:のプレフィックスを付けて記述されます。これをよりよく理解するために、いくつかの例を見てみましょう。次の Python コードを参照してください。

name: str = "Vaibhav"
age: int = 20
language: str = "Python"
student: bool = True
height: float = 5.9
print("name:", name)
print("age:", age)
print("language:", language)
print("student:", student)
print("height:", height)

出力:

name: Vaibhav
age: 20
language: Python
student: True
height: 5.9

上記の例では、式に組み込みの Python データ型を使用しています。文字列を使用して、変数の詳細で簡単な説明を提供することもできます。

次の Python コードはこれを表しています。

name: "Name of the person" = "Vaibhav"
age: "Age of the person" = 20
language: "Favorite programming language of the person" = "Python"
student: "Is the person a student?" = True
height: "Height of the person in feet" = 5.9
print("name:", name)
print("age:", age)
print("language:", language)
print("student:", student)
print("height:", height)

出力:

name: Vaibhav
age: 20
language: Python
student: True
height: 5.9

__annotations___ 属性を使用して、すべての注釈にアクセスできます。

この属性は、キーが変数で値が注釈式である辞書です。この属性は変数に関する詳細のみを提供し、関数は提供しないことに注意してください。

これについては、次の Python コードを参照してください。

name: "Name of the person" = "Vaibhav"
age: "Age of the person" = 20
language: "Favorite programming language of the person" = "Python"
student: "Is the person a student?" = True
height: "Height of the person in feet" = 5.9
print(__annotations__)

出力:

{'name': 'Name of the person', 'age': 'Age of the person', 'language': 'Favorite programming language of the person', 'student': 'Is the person a student?', 'height': 'Height of the person in feet'}

最初の例では、出力は次のようになります。

{'name': < class 'str' > , 'age': < class 'int' > , 'language': < class 'str' > , 'student': < class 'bool' > , 'height': < class 'float' > }

これまで、intfloatstr などのプリミティブデータ型についてのみ説明してきました。

ここで、オブジェクトの listtuplesetlist などの複雑なデータ型の注釈式を作成する方法を理解しましょう。このために、typing モジュールを使用します。

タイピングモジュールは、Python の標準ライブラリの一部です。例を使用して、複雑なデータ型に使用する方法を理解しましょう。

これについては、次の Python コードを参照してください。

from typing import List, Tuple, Set


def user():
    return {"name": "Vaibhav", "username": "vaibhav", "password": "vaibhav"}


class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y


middlewares: List[str] = []
points: Tuple[Point] = tuple([Point(0, 0), Point(1, 1)])
numbers: Set[int] = set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
users: List[dict] = [user()]
utils: List["function"] = [sum, len, sorted]
pairs: List[List[int]] = [[1, 2], [2, 3], [3, 4]]
print("middlewares:", middlewares, end="\n\n")
print("points:", points, end="\n\n")
print("numbers:", numbers, end="\n\n")
print("utils:", utils, end="\n\n")
print("users:", users, end="\n\n")
print("pairs:", pairs, end="\n\n")
print(__annotations__)

出力:

middlewares: []

points: (<__main__.Point object at 0x7fc658e454c0>, <__main__.Point object at 0x7fc658cef610>)

numbers: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

utils: [<built-in function sum>, <built-in function len>, <built-in function sorted>]

users: [{'name': 'Vaibhav', 'username': 'vaibhav', 'password': 'vaibhav'}]

pairs: [[1, 2], [2, 3], [3, 4]]

{'middlewares': typing.List[str], 'points': typing.Tuple[__main__.Point], 'numbers': typing.Set[int], 'users': typing.List[dict], 'utils': typing.List[ForwardRef('function')], 'pairs': typing.List[typing.List[int]]}

typing モジュールには、ジェネリックバージョンとして機能する listtuple、および set のクラス ListTuple、および Set があります。これらの 3つとは別に、DictFrozenSetDefaultDictOrderedDict などの他のジェネリッククラスがあります。

これらの汎用クラスは、変数の注釈式を提供するために使用できます。これらのクラスの横の [] 括弧内に、プリミティブデータ型、文字列の説明、クラス、または同じモジュールの他のジェネリッククラスが配置されます。

これらは関数の式を提供するために使用できることに注意してください。これについては後で学習します。タイピングモジュールについては、公式ドキュメントこちらを参照してください。

Python での関数アノテーション

関数アノテーションは、Python での関数パラメーターのデータ型と関数の戻り値のデータ型に関する詳細を提供することを目的とした式です。関数アノテーションの構文は次のとおりです。

def function( < parameter > : < expression > , < parameter > : < expression > = < default value > ) -> <expression > :

注釈式は、コロンまたは:で区切られたパラメーターの横に配置されます。

デフォルト値がある場合、それらは注釈式の後に配置されます。関数の戻り型の場合、関数のシグネチャの後に -> または矢印と注釈式が続きます。

コロンが最後に配置されていることに注意してください。いくつかの関連する例を使用して、関数の注釈を理解しましょう。

同じことについては、次の Python コードを参照してください。

from typing import List, Tuple


def create_user(name: str, age: int, hobbies: List[str] = []) -> dict:
    return {"name": name, "age": age, "hobbies": hobbies}


def create_users(users: List[Tuple]) -> List[dict]:
    result = []

    for user in users:
        result.append(create_user(name=user[0], age=user[1], hobbies=user[2]))

    return result


u1: dict = create_user("Vaibhav", 20, ["Football", "Video Games"])
data = [
    ("Rick", 40, ["Shooting"]),
    ("Derly", 38, ["Archery", "Tracking"]),
    ("Maggie", 25, []),
    ("Carol", 32, ["Cooking"]),
]
users: List[dict] = create_users(data)
print(u1)
print(users)
print(__annotations__)

出力:

{'name': 'Vaibhav', 'age': 20, 'hobbies': ['Football', 'Video Games']}
[{'name': 'Rick', 'age': 40, 'hobbies': ['Shooting']}, {'name': 'Derly', 'age': 38, 'hobbies': ['Archery', 'Tracking']}, {'name': 'Maggie', 'age': 25, 'hobbies': []}, {'name': 'Carol', 'age': 32, 'hobbies': ['Cooking']}]
{'u1': <class 'dict'>, 'users': typing.List[dict]}

ご覧のとおり、create_user() 関数は、nameagehobbies の 3つの値を受け入れ、辞書または dict を返します。

create_users() メソッドは、ユーザーのリストを表すタプルのリストを受け入れます。このメソッドは、辞書のリストを返します。

create_user() メソッドへのメソッド呼び出しの結果は、タイプ dict の変数 u1 に格納されます。また、create_users() メソッドへの関数呼び出しの結果は、List[dict] 型の変数 users に格納されます。

__annotations__ 属性は、変数に関する詳細のみを提供します。関数に関する注釈の詳細を取得するには、__annotations__ 属性を使用できます。

次の Python コードはこれを表しています。

from typing import List, Tuple


def create_user(name: str, age: int, hobbies: List[str] = []) -> dict:
    return {"name": name, "age": age, "hobbies": hobbies}


def create_users(users: List[Tuple]) -> List[dict]:
    result = []

    for user in users:
        result.append(create_user(name=user[0], age=user[1], hobbies=user[2]))

    return result


print(create_user.__annotations__)
print(create_users.__annotations__)

出力:

{'name': <class 'str'>, 'age': <class 'int'>, 'hobbies': typing.List[str], 'return': <class 'dict'>}
{'users': typing.List[typing.Tuple], 'return': typing.List[dict]}

出力ディクショナリには、すべての注釈の詳細が含まれます。リターンタイプの場合、return が辞書のキーであることに注意してください。パラメータの場合、パラメータ名がキーです。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.