

型アノテーションによってエラーが出るタイミングが変わってしまいます。  
変数を宣言して初期化をしないクラスを定義します。Test2では型アノテーションだけ実施します。

[code]

    class Test1 :
        def __init__(self) :
            self.a = 1
            self.b
    
    class Test2 :
        def __init__(self) :
            self.a = 1
            self.b : int
    
[/code]

[code]

    >>> test1 = Test1()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in __init__
    AttributeError: 'Test1' object has no attribute 'b'
    
[/code]

これは納得できるのですが

[code]

    >>> test2 = Test2()
    >>> test2.b
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Test2' object has no attribute 'b'
    
[/code]

ここで`test2.b`を参照するまでエラーが出ないのが不思議です。

[code]

    >>> vars(test2)
    {'a': 1}
    
[/code]

`test2.b`が存在しないのはわかるのですが、インスタンス化したときになぜエラーが表示されないのでしょう。


CC BY-SA 4.0
2020-07-03T09:53:51.710
68247
2020-07-04T06:26:44.793
2020-07-03T13:21:35.663
19110
40921
question
python python3
型アノテーションをつけると__init__で初期化できてなくてもインスタンス化できてしまう


型アノテーションだけの行でエラーが起てしまうようだと「型アノテーションだけをする」というのが不可能になるからです。

* * *

(追記)  
PEP526に記載ありました。  
<https://www.python.org/dev/peps/pep-0526/#global-and-local-variable-
annotations>

> Being able to omit the initial value allows for easier typing of variables
> assigned in conditional branches:
[code]

    sane_world: bool
    if 2+2 == 4:
        sane_world = True
    else:
        sane_world = False
    
[/code]

> Omitting the initial value leaves the variable uninitialized:
[code]

    a: int
    print(a)  # raises NameError
    
[/code]


CC BY-SA 4.0
2020-07-03T13:14:08.373
68256
2020-07-04T06:26:44.793
2020-07-04T06:26:44.793
12274
12274
68247
answer