83950


# 環境

  * Python3.8.6

# 背景

Python3.8以上で動作するコードを書いています。

型ヒントを付ける際、今までは`typing.List`などを使っていました。  
しかしPython3.9では`typing.List`などが非推奨になったので、`from __future__ import
annotations`を実行して`list`を利用できるようにしました。

# 問題

以下のサイトにあるように、`list`を使って型エイリアスを定義したいです。  
<https://docs.python.org/ja/3/library/typing.html#type-aliases>

[code]

    from __future__ import annotations
    
    Vector = list[float]
    
    def scale(scalar: float, vector: Vector) -> Vector:
        return [scalar * num for num in vector]
    
    # typechecks; a list of floats qualifies as a Vector.
    new_vector = scale(2.0, [1.0, -4.2, 5.4])
    
[/code]

しかし、以下のエラーが発生しました。

[code]

    $ python foo.py
    Traceback (most recent call last):
      File "foo.py", line 5, in <module>
        Vector = list[float]
    TypeError: 'type' object is not subscriptable
    
[/code]

# 質問

Python3.8で`list`を使って型エイリアスを定義するのには、どのように書けばよいでしょうか？

以下のように`typing.List`を使用すれば動きますが、Python3.9では非推奨なので、できればこのような書き方はしたくありません。

[code]

    from typing import List
    Vector = List[float]
    
[/code]


CC BY-SA 4.0
2021-12-03T03:22:13.553
83932
2021-12-13T11:17:40.147
2021-12-03T06:46:48.683
3060
19524
question
python python3
Python3.8で`list`を使って型エイリアスを定義する方法


型ヒントとして使う場合は, 次のように指定可能だけど

[code]

    >>> from __future__ import annotations
    >>> vct: list[float]
    
[/code]

代入で使う (`Vector = list[float]`) 場合は Python 3.9 以降の機能の様なので  
どうしても使いたい場合は, こんな風にするとか？

[code]

    if sys.version_info[0:2] == (3,8):
        from typing import List as list
    
    Vector = list[float]
    # 他のなにか
    
    if sys.version_info[0:2] == (3,8):
        del list # これ以降は普通の list
    
[/code]


CC BY-SA 4.0
2021-12-04T03:15:22.440
83950
2021-12-04T03:15:22.440
43025
83932
answer