Python3.13の新機能 Python 3.13の新機能(その2)PEP 696: 型パラメータのデフォルト型

PEP 703: フリースレッドモードPEP 696: 型パラメータのデフォルト型

従来のジェネリック型では、型を決定できない型パラメータは Any などにされていました。

class A[T]:
    foo: T | None
    def __init__(self, foo: T | None=None):
        self.foo = foo

a = A()
reveal_type(a) # Mypyでは a は A[Any] となる

PEP 696: Type Defaults for Type Parameters では、指定されていない型パラメータにデフォルトの型を指定できるようになりました。

class A[T=int]: # T のデフォルトを int に指定
    foo: T | None
    def __init__(self, foo: T | None=None):
        self.foo = foo

a = A()
reveal_type(a) # a は A[int]

Python3.11以前の、TypeVar を使ったジェネリック型では次のように指定します。

from typing import TypeVar, Generic

T = TypeVar('T', default=int)  # T のデフォルト値を int に指定

class A(Generic[T]):
    foo: T | None
    def __init__(self, foo: T | None=None):
        self.foo = foo

TypeVarTupleのデフォルト値

TypeVarTuple にも、次の形式でデフォルト値を指定できます。TypeVarTuple については、Python 3.11の新機能(その5) PEP-646 可変長ジェネリックス の解説を参照してください。

class B[*Ts = *tuple[int, str]]:
    foo: tuple[*Ts]

    def __init__(self, foo: tuple[*Ts]|None=None):
        if foo:
            self.foo = foo

b = B()
reveal_type(b) # b は B[int, str]"

明示的に TypeVarTuple を宣言する場合は、次のように次のように指定します。

from typing import Generic, TypeVarTuple, Unpack

Ts = TypeVarTuple("Ts", default=Unpack[tuple[int, str]])

class B(Generic[*Ts]):
    foo: tuple[*Ts]

    def __init__(self, foo: tuple[*Ts]|None=None):
        if foo:
            self.foo = foo

ParamSpecのデフォルト値

ParamSpec の場合は、次のように[]を使ってデフォルト値を指定します。ParamSpec については、Python 3.10の新機能(その5) パラメータ仕様変数 の解説を参照してください。

class C[**P=[int, str]]:
    foo: Callable[P, int]
    def __init__(self, f: Callable[P, int]|None):
        pass

c = C(None)
reveal_type(c) # C[(int, str)]

def func(i:int, s:str)->int:
    return 0
f.foo = func # Ok

明示的に ParamSpec を宣言する場合は、次のように次のように指定します。

P = ParamSpec("P", default=[int, str])
class C(Generic[P]):
    foo: Callable[P, int]
    def __init__(self, f: Callable[P, int]|None):
        pass
Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索